2

当我初始化一个数组时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

4 回答 4

8
(8,9,7,67,11)

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

如果您使用花括号,您a可能会按照预期初始化 的两个组件数组。

于 2012-11-03T17:19:41.203 回答
3
 int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};

相当于(在块范围内):

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

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

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

于 2012-11-03T17:19:14.403 回答
3

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

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

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

于 2012-11-03T17:19:50.507 回答
1

这是 你必须使用的概念comma operator来初始化数组comma separator{}

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

here(8,9,7,67,11)等价于11because ofcomma operator 并且(7,8,9,199,89)等价于89for the same 因为逗号运算符被计算为left to right并且最右边的值是返回的值

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

但是(8,9,7,67,11),(7,8,9,199,89)用逗号() , ()comma separator

于 2012-11-03T17:20:19.677 回答