在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 

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

 (8,9,7,67,11) 

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

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

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

相当于(在块范围内):

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

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

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

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

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

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

这是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和最left to right被评估value是返回的值

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

但是(8,9,7,67,11),(7,8,9,199,89)但在() , ()中使用的comma separatorcomma separator