2015-04-01 147 views
3

數組的第二個維度不明確。這個數組的大小是48,其中int是2個字節,但是int a[6][4]int a[6][(2,2)]之間的確切區別是什麼?`int a [6] [(2,2)]`array是什麼意思?

+6

的毫無意義的,混淆代碼只是另一種情況。我不知道爲什麼人們如此着迷於這樣的胡說,並瘋狂地提出有關它的任何話題...... [在C中逗號操作符做什麼?](http://stackoverflow.com/questions/52550/what-做最逗號操作-DO在-C)。 – Lundin 2015-04-01 07:01:07

回答

14

int a[6][4]和int a[6][(2,2)]的確切區別是什麼?

有一個很大的區別。 int a[6][(2,2)]很大程度上相當於int a[6][2]。表達式(2,2)涉及comma operator並且評估爲2

的微妙的差異(見從@Virgile評論)是(2,2)不是C.常量表達式所以int a[6][(2,2)]確實是一個大小6陣列大小2個可變長度數組的。因此從技術上講,它確實是相當於

int n = 2; 
int a[6][n]; 
+1

實際上,'int a [6] [(2,2)]'不是_exactly_與int a [6] [2]'相同:「(2,2)'不是一個整型常量表達式標準第6.6節的意義)。這意味着前者在技術上是一個不能隨處使用的可變長度數組。例如'gcc'會拒絕這樣的聲明作爲全局變量。 – Virgile 2015-04-01 08:21:57

+0

@Virgile這很有趣。它似乎是C++中的一個常量表達式。我澄清了這一點。 – juanchopanza 2015-04-01 09:12:45

1
int a[6][(2,2)] = int a[6][2]; 

逗號(,)經營者有一個至少percedence所以你得到一個數組如上。

你可以測試一下自己

int main(void) { 
int a[6][4]; 
int b[6][(2,2)]; 

printf("%d\n",sizeof(int)); 
printf("%d %d\n",sizeof(a),sizeof(b)); 
    return 0; 
} 

int x = (3,4);所以你能指望的x價值是什麼?

它的計算結果爲x=4同樣適用於您的數組。

3

在你的代碼

int a[6][(2,2)] 

基本上是

int a[6][2]; 

說明:

按照該標準C11,章§6.5.17,逗號運算,

逗號運算符的左操作數被評估爲void表達式;它的評估與右操作數的評估之間有一個順序點。然後評估右操作數;結果有它的類型和價值。

int a[6][(2 , 2)]; 
     ^^
      | | 
     [A] | 
      [B] 

假設,AB,操作的兩個操作數。然後,順序地

  1. A被評估以2(作爲void expression;)。結果被丟棄。
  2. B評估爲2。由於,運算符具有右側操作數的類型和值,因此最終結果爲2

所以基本上,int a[6][(2,2)];成爲int a[6][2];