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
.
我想将此问题标记为数百个 ++
运算符序列点问题之一的副本,但您的问题似乎是关于为什么这种形式没有不同。
当我用 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
.
我想将此问题标记为数百个 ++
运算符序列点问题之一的副本,但您的问题似乎是关于为什么这种形式没有不同。