请注意,我之所以做这个奇怪的任务,并不是因为我不清楚语法或对c还是陌生的。
我只是在尝试将一个int分配给一个数组会发生什么:
int a = {1, 2, 3};
为此,我收到以下警告:
warning: excess elements in scalar initializer
int a = {1, 2, 3};
^
warning: excess elements in scalar initializer
int a = {1, 2, 3};
^
当我打印a的内容时,我得到1
。
但是当我这样做时:
int a;
a = {1, 2, 3};
我收到一个错误:
error: expected expression before ‘{’ token
a = {1, 2, 3};
^
尽管我知道数组不是要分配给int
变量的,但以上结果使我提出了疑问:
int x; x = ...
和int x = ...
之间的区别和
答案 0 :(得分:5)
首先
int a = {1, 2, 3};
是定义和初始化语句,
int a;
a = {1, 2, 3};
是定义和赋值声明。
他们有不同的规则。语法{1, 2, 3}
称为花括号括起来的初始化程序列表,该列表可以在初始化语句中使用,而不能在赋值中使用-这是一个语法错误。这样,就可以回答第二个片段中的错误了。
对于第一个代码段,对于标量,引用C11
,第§6.7.9/ P11章
标量的初始值设定项应为单个表达式,可以选择用大括号括起来。 [...]
因此,表达式{1, 2, 3}
试图提供一个以上的元素,这是多余的。那就是您的编译器警告您的内容。