C语言中printf内使用后置自增age++为何输出原值而非自增后值?
问题原因说明
这是C语言中后置自增运算符的标准语义导致的:age++属于后置自增表达式,C标准明确规定了这类表达式的执行顺序:
- 第一步:先取出变量
age的当前值,作为整个age++表达式的返回结果 - 第二步:对变量
age执行+1操作,修改变量本身的存储值
你写的printf("%i\n", age++);中,printf函数读取的是age++这个表达式的返回值,也就是第一步取到的自增前的旧值,所以打印结果是旧值。变量的自增操作要等整个表达式求值完成后才会执行,因此调试时会看到执行完printf语句后age的值已经更新。
解决方案
如果需要打印自增后的新值,可选择以下两种方案:
- 改用前置自增运算符
++age:前置自增的执行顺序是先修改变量值,再返回修改后的新值,代码修改为printf("%i\n", ++age);即可 - 分开编写自增和打印逻辑,可读性更高,也能避免运算符优先级导致的意料之外的结果:
age++; printf("%i\n", age);
注意:不建议在复杂表达式中混用前后置自增运算符,很容易触发未定义行为,也会大幅降低代码可读性,非必要场景尽量把自增操作单独成一行代码。
内容的提问来源于stack exchange,提问作者Logan Walker
相关产品推荐
相关产品推荐

