在声明变量时进行初始化与在c中的单独行上进行比较

时间:2019-03-05 06:41:20

标签: c arrays initialization variable-assignment

请注意,我之所以做这个奇怪的任务,并不是因为我不清楚语法或对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 = ...之间的区别

  • 究竟是什么引起警告或错误消息?

1 个答案:

答案 0 :(得分:5)

首先

int a = {1, 2, 3};

是定义和初始化语句,

int a;
a = {1, 2, 3};

是定义和赋值声明。

他们有不同的规则。语法{1, 2, 3}称为花括号括起来的初始化程序列表,该列表可以在初始化语句中使用,而不能在赋值中使用-这是一个语法错误。这样,就可以回答第二个片段中的错误了。

对于第一个代码段,对于标量,引用C11,第§6.7.9/ P11章

  

标量的初始值设定项应为单个表达式,可以选择用大括号括起来。 [...]

因此,表达式{1, 2, 3}试图提供一个以上的元素,这是多余的。那就是您的编译器警告您的内容。