在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 operator
和comma 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 separator
是comma separator