C++ cout语句中前置与后置自增运算符运算结果原理求解
C++ 前后置自增运算符混合运算的输出原理说明
你测试的这类代码的输出结果不具备通用性,仅和你当前使用的编译器、编译标准以及编译参数有关,在生产环境中禁止编写同类逻辑。
基础规则先明确
- 前置自增
++t:先将t的值加1,返回加1后的t的引用(本质返回的是t变量本身) - 后置自增
t++:先保存t当前的原值作为返回值,再将t的值加1,返回的是t修改前的临时值 - C标准中,**算术运算符的多个操作数、C17之前
<<链式调用的多个输出项的求值顺序是未指定的**,编译器可以自由选择求值顺序,只要最终输出顺序符合<<从左到右的要求即可。你当前使用的编译器(GCC 旧版本默认C++11/14标准)的求值规则是:cout链式输出的多个表达式从右到左求值,再按从左到右输出计算好的结果。
对应你的测试结果的计算逻辑
以你给出的测试用例为例,按照你编译器的求值规则,计算过程如下:
- 测试1:t=1时
cout<<++t <<"\t"<< ++t<<"\n";- 从右到左求值:先算右侧
++t,t变成2,返回t本身;再算左侧++t,t变成3,返回t本身 - 按左到右输出两个结果,都是t当前值3,所以输出
3 3
对应加法++t + ++t:两个操作数求值后t已经是3,加法为3+3=6,和你的结果一致。
- 从右到左求值:先算右侧
- 测试2:t=1时
cout<<++t <<"\t"<< t++<<"\n";- 从右到左求值:先算右侧
t++,返回临时值1,t变成2;再算左侧++t,t变成3,返回t本身 - 输出时左项为t当前值3,右项为之前保存的临时值1,所以输出
3 1
对应加法++t + t++:求值后t为3,返回值相加为3+2=5,和你的结果一致。
- 从右到左求值:先算右侧
其余所有测试用例的结果都可以按照「先从右到左计算所有表达式的值,保存返回结果,再从左到右输出保存的结果」的规则推导出来。
注意事项
这类代码属于C++标准中的未定义/未指定行为范畴,换用其他编译器(比如MSVC、Clang)、升级编译器版本或者开启不同编译参数,都可能得到完全不同的输出结果,没有普遍参考意义,仅可用于理解编译器求值逻辑,绝对不要在实际项目中使用。
内容的提问来源于stack exchange,提问作者Aakash Shivanshu
相关产品推荐
相关产品推荐

