以下代码给出了“无效的初始化程序”错误:
int a[]=(1,2,3);
但是以下编译成功虽然它将','视为逗号操作符而不是分隔符:
int a[][2]={(1,2),(3,4)};
那么为什么{1}}对于一维数组而不是二维数组无效?
答案 0 :(得分:8)
在第一个例子中:
int a[]=(1,2,3);
初始值设定项是int
类型的(相当奇怪的)表达式。 (它包含两个逗号运算符,并产生值3
。)对象是一个数组。初始化无效,因为它是类型不匹配。
第二个:
int a[][2]={(1,2),(3,4)};
相当于:
int a[][2] = { 2, 4 };
这是有效的,因为它允许在初始化程序中省略嵌套的花括号;元素用于初始化对象的连续元素。第一个和第三个逗号是逗号运算符;第二个是分隔符。
如果初始化程序只是目标类型的表达式,那么最外面的花括号是可选,无论它是标量,结构还是联合。例如,您可以写:
int x = 42;
int y = { 42 };
对于指定元素值(对于数组,结构或联合对象)的初始值设定项,最外面的花括号是 required 。
例如:
struct foo {
int x;
int y;
};
struct foo arr[2] = { 1, 2, 3, 4 };
是有效的 - 但它写得更清楚:
struct foo arr[2] = { { 1, 2 }, { 3, 4 } };
除了第一个例子无效之外,两者都是不好的风格。第一个可能是:
int a[] = { 1, 2, 3 };
和第二个:
int a[][2] = { 2, 4 };
或
int a[][2] = {{1, 2}, {3, 4}};
取决于意图。
答案 1 :(得分:2)
你忘记了第一个例子中的花括号。荣誉(花括号)表示数组内容的初始化,然后内容由您在这些荣誉中的声明处理。基本上你没有在第一个例子中初始化数组。括号表示评估的顺序,而不是与函数一样的参数。