2015-04-01 177 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];

相关问题