c中(a=a+1)+(a=a+1)+(a=a+1)的结果?

The result of (a=a+1)+(a=a+1)+(a=a+1) in c?

当我用 gcc 和 运行

编译这段代码时
int a=1;
printf("%d",(a=a+1)+(a=a+1)+(a=a+1));

我期望结果是 2+3+4=9,但输出是 10。

我知道 (++a)+(++a)+(++a) 中存在未定义的行为,因为三个 ++ 副作用可能是 运行 在评估所有 (++a) 之前。

但我认为 a=a+1 的值正是赋值后 a 的值。所以编译器不能先处理三个a=a+1,在a=a+1求完后,再用变量a中的值作为a=a+1的值。

我想知道按照c标准哪里错了

赋值运算符不是序列点。假设 a 只是一个标识符(例如,不是一个可能扩展为更复杂的东西的宏参数)并且没有原子类型 (C11),a=a+1 相同的 在语义上变为 ++a.

我想将此问题标记为数百个 ++ 运算符序列点问题之一的副本,但您的问题似乎是关于为什么这种形式没有不同。