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

标签 c expression undefined-behavior sequence-points

<分区>

当我用 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=a+1的值所有 a=a+1 均已评估。

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

最佳答案

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

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

关于c - c中(a=a+1)+(a=a+1)+(a=a+1)的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630008/

相关文章:

mysql - 数字文字 0 等于 VARCHAR 列中的任何内容

c - 评估包含未初始化指针的条件 - IN,但它会崩溃吗?

c - 为堆分配的对象丢弃 `const` 是否合法/安全?

c - C中strcat函数的递归实现

c - pthread_join void **retval

reporting-services - RDLC 表达式扩展方法

Java 表达式解析获取对象

c++ - 未定义行为是否依赖于 C++ 中的编译器?

C 黑客教程

通过泛型指针调用 C 函数