以下代码给出了“无效的初始化程序”错误:
int a[]=(1,2,3);
但是以下编译成功,尽管它认为 ',' 作为逗号 OPERATOR 而不是 SEPARATOR:
int a[][2]={(1,2),(3,4)};
那么为什么()
对于一维数组无效而不是二维数组呢?
以下代码给出了“无效的初始化程序”错误:
int a[]=(1,2,3);
但是以下编译成功,尽管它认为 ',' 作为逗号 OPERATOR 而不是 SEPARATOR:
int a[][2]={(1,2),(3,4)};
那么为什么()
对于一维数组无效而不是二维数组呢?
在第一个示例中:
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 };
指定元素值(对于数组、结构或联合对象)的初始化程序需要最外面的花括号。
例如:
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}};
取决于意图。
您忘记了第一个示例中的花括号。荣誉(花括号)表示数组内容的初始化,然后由您在这些荣誉中的声明处理内容。基本上,您没有在第一个示例中初始化数组。括号表示评估的顺序,而不是与函数一样的参数。