【问题标题】:Can't assign to struct without explicit type specification没有明确的类型规范就不能分配给结构
【发布时间】:2021-12-12 19:25:23
【问题描述】:

有了这个定义

struct A {
    int x;
};

为什么

struct A a = {0};

有效的语法,而

struct A a;

a = {0};

产生错误“'{'标记之前的预期表达式”?

如果我将该行替换为

a = (struct A){0};

那么一切都很好,所以分配给结构不是问题。

【问题讨论】:

  • 吹毛求疵,这不是演员表。这是compound literal
  • 我手头没有相应的标准,但一个是初始化语法,另一个需要是“赋值语法”,它没有为结构声明。我想编译器将后者转换为“使用初始化语法构造类型 A 的变量,然后将其复制到 a”,尽管我不能肯定地说。
  • @RefugnicEternium:赋值的语法对于结构和其他对象是一样的。 a = {0}; 不起作用,因为{0} 不表示结构值,而不是因为无法分配结构。
  • @EricPostpischil 我的意思是,您只能将(相同类型的)结构分配给结构,但不能分配初始化列表。如果我未能正确表达自己,我深表歉意。

标签: c struct


【解决方案1】:

花括号语法{}指定一个初始化列表,这样的列表只能在初始化中使用。

在这种情况下:

struct A a = {0};

a 正在使用{0} 声明和初始化,并且是有效的语法。

这是无效的:

a = {0};

因为这是一个表达式,所以初始化列表不能出现在表达式中。

这个:

a = (struct A){0};

不是强制转换,而是复合文字的一个例子。语法类似于强制转换,但它所做的是创建struct A 类型的对象并为其提供初始化程序。然后将此对象分配给a

【讨论】:

    【解决方案2】:

    你只能在声明中使用初始化器,所以声明a = {0};是无效的。

    在语句 a = (struct A){0}; 中,您实际上是使用复合文字表达式进行赋值,这是有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2022-01-25
      • 2021-12-04
      • 1970-01-01
      • 2021-08-15
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多