没有明确的类型规范就不能分配给结构

Can't assign to struct without explicit type specification

有了这个定义

struct A {
    int x;
};

为什么是

struct A a = {0};

语法有效而

struct A a;

a = {0};

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

如果我将该行替换为

a = (struct A){0};

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

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

在这种情况下:

struct A a = {0};

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

这是无效的:

a = {0};

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

这个:

a = (struct A){0};

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

您只能在声明中使用初始值设定项,因此语句 a = {0}; 无效。

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