在C中,如果我使用()来初始化双维数组而不是{},究竟会发生什么?

时间:2012-11-03 17:17:58

标签: c

初始化数组a[][]时:

int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};

然后显示数组元素。

为什么我会:

11 89 0 0 0 
0 0 0 0 0

如果你在这里使用花括号而不是第一个括号会怎么样?

4 个答案:

答案 0 :(得分:8)

(8,9,7,67,11)

是使用逗号运算符的表达式,其值为11.另一个初始化程序也是如此。因此,您只显式初始化前两个元素,然后将所有其他元素初始化为0.您的编译器应警告初始化器中缺少大括号。

如果使用花括号,则初始化a的两个组件数组,可能是这样。

答案 1 :(得分:3)

 int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};

相当于(在块范围内):

 int a[2][5]={11, 89};

,是C 逗号运算符。它从左到右计算其操作数,并产生右操作数的值。

在文件范围内,数组初始值设定项必须是常量,并且由于,表达式永远不是常量表达式,因此数组声明无效。

答案 2 :(得分:3)

因为您没有使用大括号,而是使用括号。你想要:

int a[2][5] = { { 8,9,7,67,11 }, { 7,8,9,199,89 } };
//              ^^^          ^^^^^^            ^^^

在您的原始代码中,您刚认识了comma operator,并且您实际上已经编写了int a[2][5] = { 11, 89 };。这是合法的,但它会将所有缺失的元素初始化为零。

答案 3 :(得分:1)

这是comma operatorcomma separator的概念 您必须使用{}初始化数组

int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
由于(8,9,7,67,11),此处11相当于comma operator 并且(7,8,9,199,89)相当于89,因为逗号运算符的计算结果为left to right,最右边的值是返回的值

因此它相当于a[2][5]={11,89}

(8,9,7,67,11),(7,8,9,199,89)() , ()中使用的逗号为comma separator