在第一个示例中:
int a[]=(1,2,3);
初始化程序是一个类型为int
的表达式(相当奇怪)。它包含两个逗号运算符,并产生值3
。该对象是一个数组。初始化无效,因为存在类型不匹配。
第二个:
int a[][2]={(1,2),(3,4)};
等同于:
int a[][2] = { 2, 4 };
这段话在IT技术方面,需要翻译的内容为:“由于初始化器中允许省略嵌套花括号,因此该语句是有效的;元素用于初始化对象的连续元素。第一个和第三个逗号是逗号运算符;第二个是分隔符。”
如果初始化器仅仅是目标类型的表达式(无论它是标量、结构体还是联合体),则最外层的花括号是可选的。例如,您可以这样写:
int x = 42;
int y = { 42 };
外层大括号在为数组、结构体或联合体对象指定元素值的初始化器中是必需的。
例如:
struct foo {
int x;
int y;
};
struct foo arr[2] = { 1, 2, 3, 4 };
“is valid”是有效的,但更清晰的写法是:
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}};
根据意图而定。