3

以下代码给出了“无效的初始化程序”错误:

     int a[]=(1,2,3);

但是以下编译成功,尽管它认为 ',' 作为逗号 OPERATOR 而不是 SEPARATOR:

    int a[][2]={(1,2),(3,4)};

那么为什么()对于一维数组无效而不是二维数组呢?

4

2 回答 2

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 };

指定元素值(对于数组、结构或联合对象)的初始化程序需要最外面的花括号。

例如:

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}};

取决于意图。

于 2012-11-15T09:08:58.233 回答
2

您忘记了第一个示例中的花括号。荣誉(花括号)表示数组内容的初始化,然后由您在这些荣誉中的声明处理内容。基本上,您没有在第一个示例中初始化数组。括号表示评估的顺序,而不是与函数一样的参数。

于 2012-11-15T08:58:43.993 回答