C语言a=6时b=a+ ++a结果为14而非13的原因求解
关于C语言
a + ++a表达式运算结果的解释 你写的代码中b = a + ++a属于C语言未定义行为,结果没有统一的标准要求,你的理解偏差本质是默认了编译器的执行顺序,而C标准并没有做这个强制约束。
核心原因说明
C语言的表达式求值规则里,只有「序列点」的位置会明确要求前面的所有操作副作用都必须完成,才能执行后面的操作。而在+运算符左右两侧的子表达式求值没有序列点分隔,两个子表达式的执行顺序完全由编译器自主决定:
- 你默认的执行顺序是:先取左侧
a的值(6),再执行右侧++a(a变成7),最后相加得到6+7=13,这是一种合法的编译器实现逻辑。 - 你当前编译环境的执行顺序是:先执行右侧
++a(a变成7),再分别取左右两侧a的值(都是7),最后相加得到7+7=14,这也是另一种合法的编译器实现逻辑。
也就是说两种结果都符合C标准的要求,甚至在部分编译环境下还可能出现其他异常结果,都是被允许的,不存在唯一正确的运算结果。
正确写法建议
永远不要在同一个表达式中对同一个变量同时做读取和修改操作,如果你需要稳定得到预期的13的结果,拆分表达式即可保证所有编译器执行结果一致:
#include <stdio.h> int main () { int a = 6, b; int pre_a = a; // 提前保存a修改前的值 ++a; b = pre_a + a; printf("%d", b); return 0; }
内容的提问来源于stack exchange,提问作者ANDY WANG
相关产品推荐
相关产品推荐

