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

Pol*_*000 1 c arrays initialization variable-assignment

请注意,我正在执行此奇怪的任务不是因为我不清楚语法或对c还是陌生的。

我只是在尝试如果将一个int分配给一个数组会发生什么:

int a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

为此,我收到以下警告:

 warning: excess elements in scalar initializer
  int a = {1, 2, 3};
              ^
warning: excess elements in scalar initializer
  int a = {1, 2, 3};
                 ^
Run Code Online (Sandbox Code Playgroud)

当我打印a的内容时,我得到1

但是当我这样做时:

int a;
a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

error: expected expression before ‘{’ token
  a = {1, 2, 3};
      ^
Run Code Online (Sandbox Code Playgroud)

尽管我知道数组不是要分配给int变量的,但以上结果使我提出了疑问:

  • 之间的差异int x; x = ...int x = ...

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

Sou*_*osh 5

首先,

int a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

是定义和初始化语句,并且

int a;
a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

是定义和赋值语句。

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

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

标量的初始化程序应为单个表达式,可以选择用大括号括起来。[...]

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

  • @Inian如您所知,实际的标准文档不是免费的。有一些草稿版本可在线免费获得。是的,我指的是您所指的同一个人。我不会在此处添加链接,因为我不能保证这些(非官方)资源的可用性。快速的Google搜索应该会带您到草稿版本。 (2认同)