为何两段C代码输出不同?a+(a++)得21,b+(a++)得20
问题分析与解答
两段代码的运行结果
第一段代码:
#include<stdio.h> int main() { int a=10,b=10; printf("%d",a+(a++)); }
输出结果:21
第二段代码:
#include<stdio.h> int main() { int a=10,b=10; printf("%d",b+(a++)); }
输出结果:20
核心原因解析
第二段代码的明确逻辑
b+(a++)的行为完全符合C语言标准:
b的值固定为10;- 后置自增运算符
a++的规则是先返回a当前的原始值(10),再将a的数值加1; - 最终计算为
10+10=20,结果唯一且确定。
第一段代码的编译器依赖特性
a+(a++)属于C语言标准中的未定义行为——标准没有规定表达式中a的两次读取操作与自增操作的执行顺序。你看到的输出21,只是当前使用的编译器选择了特定的求值顺序:
- 先读取第一个
a的初始值10,再执行a++使a变为11,最后完成加法10+11=21; - 换用其他编译器,可能出现不同结果(比如输出20),这都是标准允许的,因为这类写法的求值顺序不受约束。
本质上不是后置自增运算符的规则变了,而是第一段代码的写法违反了C语言的表达式求值规范,导致结果依赖编译器实现。
内容的提问来源于stack exchange,提问作者Noobcoder
相关产品推荐
相关产品推荐

