【问题标题】:Initializing while declaring a variable vs doing it on separate lines in c在声明变量时初始化与在 c 中的单独行上进行初始化
【发布时间】:2019-07-26 13:37:06
【问题描述】:

请注意,我做这个奇怪的作业不是因为我不清楚语法或对 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 = ...的区别

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

【问题讨论】:

  • 他们都错了,错误消息的内容是什么以及任何行为都取决于编译器编写者
  • 所以错误消息或警告完全独立于我进行初始化的方式(直接与在两个单独的行上)?
  • 可能是编译器在初始化时分配了它的地址,或者它自动取消对第一个元素的引用,等等。但在分配的情况下,它实际上取决于编译器的设计方式。尝试在不同的编译器中运行您的代码以查看更改...
  • int a[3] = {1, 2, 3};
  • @AlejandroBlasco,或者更好,int a[ ] = {1, 2, 3};

标签: c arrays initialization variable-assignment


【解决方案1】:

首先,

int a = {1, 2, 3};

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

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

是一个定义和赋值陈述。

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

对于第一个 sn-p,对于标量,引用 C11,第 §6.7.9/P11 章

标量的初始值设定项应该是一个表达式,可选地用大括号括起来。 [...]

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

【讨论】:

  • @Inian 你应该知道,实际的标准文档不是免费的。有可在线免费获得的草稿版本。是的,我指的是你指出的同一个。我不会在这里添加链接,因为我不能保证这些(非官方)来源的可用性。一个快速的谷歌搜索应该会引导你到草稿版本。
  • 当然,这是有道理的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多