使用大括号进行1D和2D阵列初始化

时间:2012-11-15 08:56:00

标签: c

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

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

但是以下编译成功虽然它将','视为逗号操作符而不是分隔符:

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

那么为什么{1}}对于一维数组而不是二维数组无效?

2 个答案:

答案 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)

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

相关问题