You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:18:15