1

请注意,我正在做这个奇怪的任务,不是因为我不清楚语法或对 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 = ...

  • 究竟是什么导致了警告或错误消息?
4

1 回答 1

5

首先,

int a = {1, 2, 3};

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

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

是定义和赋值语句。

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

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

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

因此,该表达式{1, 2, 3}试图提供更多的元素,即过剩。这就是您的编译器警告您的内容。

于 2019-03-05T07:00:51.540 回答