C++中operator <<中的自增自减运算

C++的cout用来输出数据,但是在cout中使用自增、自减运算符时需格外注意。如下代码:

#include <iostream>
using namespace std;
int main()
{
    int x = 1;
    cout << x++ << " " << x-- << endl;   // 输出 0  1

    x = 1;
    cout << x-- << " " << x++ << endl;   // 输出 2  1

    x = 1;
    cout << ++x << " " << --x << endl;   // 输出 1  1

    x = 1;
    cout << --x << " " << ++x << endl;   // 输出 1  1
    return 0;
}

运算结果如下:

这里写图片描述

通过调试,查看汇编代码如下。cout<<expression1<<expression2<<endl中输出顺序肯定是从左到右,问题是求值顺序不确定。参考这个帖子

    cout << x++ << " " << x-- << endl;
00DD9612  mov         eax,dword ptr [x]  
00DD9615  mov         dword ptr [ebp-0D0h],eax  
00DD961B  mov         ecx,dword ptr [x]  
00DD961E  sub         ecx,1                        //先减1
00DD9621  mov         dword ptr [x],ecx  
00DD9624  mov         edx,dword ptr [x]  
00DD9627  mov         dword ptr [ebp-0D4h],edx  
00DD962D  mov         eax,dword ptr [x]  
00DD9630  add         eax,1                        //再加1
00DD9633  mov         dword ptr [x],eax  
00DD9636  mov         esi,esp  
00DD9638  push        0DD1406h  
00DD963D  mov         edi,esp  
00DD963F  mov         ecx,dword ptr [ebp-0D0h]  
00DD9645  push        ecx  
00DD9646  push        0DDDD10h  
00DD964B  mov         ebx,esp  
00DD964D  mov         edx,dword ptr [ebp-0D4h]  
00DD9653  push        edx  
00DD9654  mov         ecx,dword ptr ds:[0DE10B8h]  
00DD965A  call        dword ptr ds:[0DE109Ch]  
00DD9660  cmp         ebx,esp  
00DD9662  call        __RTC_CheckEsp (0DD1352h)  
00DD9667  push        eax  
00DD9668  call        std::operator<<<std::char_traits<char> > (0DD14FBh)  //输出
00DD966D  add         esp,8  
00DD9670  mov         ecx,eax  
00DD9672  call        dword ptr ds:[0DE109Ch]  
00DD9678  cmp         edi,esp  
00DD967A  call        __RTC_CheckEsp (0DD1352h)  
00DD967F  mov         ecx,eax  
00DD9681  call        dword ptr ds:[0DE1094h]  
00DD9687  cmp         esi,esp  
00DD9689  call        __RTC_CheckEsp (0DD1352h)  
    cout << x-- << " " << x++ << endl;
00DD9695  mov         eax,dword ptr [x]  
00DD9698  mov         dword ptr [ebp-0D0h],eax  
00DD969E  mov         ecx,dword ptr [x]  
00DD96A1  add         ecx,1                         //先加1
00DD96A4  mov         dword ptr [x],ecx  
00DD96A7  mov         edx,dword ptr [x]  
00DD96AA  mov         dword ptr [ebp-0D4h],edx  
00DD96B0  mov         eax,dword ptr [x]  
00DD96B3  sub         eax,1                         //再减1
    cout << x-- << " " << x++ << endl;
00DD96B6  mov         dword ptr [x],eax  
00DD96B9  mov         esi,esp  
00DD96BB  push        0DD1406h  
00DD96C0  mov         edi,esp  
00DD96C2  mov         ecx,dword ptr [ebp-0D0h]  
00DD96C8  push        ecx  
00DD96C9  push        0DDDD10h  
00DD96CE  mov         ebx,esp  
00DD96D0  mov         edx,dword ptr [ebp-0D4h]  
00DD96D6  push        edx  
00DD96D7  mov         ecx,dword ptr ds:[0DE10B8h]  
00DD96DD  call        dword ptr ds:[0DE109Ch]  
00DD96E3  cmp         ebx,esp  
00DD96E5  call        __RTC_CheckEsp (0DD1352h)  
00DD96EA  push        eax  
00DD96EB  call        std::operator<<<std::char_traits<char> > (0DD14FBh)  //输出
00DD96F0  add         esp,8  
00DD96F3  mov         ecx,eax  
00DD96F5  call        dword ptr ds:[0DE109Ch]  
00DD96FB  cmp         edi,esp  
00DD96FD  call        __RTC_CheckEsp (0DD1352h)  
00DD9702  mov         ecx,eax  
00DD9704  call        dword ptr ds:[0DE1094h]  
00DD970A  cmp         esi,esp  
00DD970C  call        __RTC_CheckEsp (0DD1352h)  
cout << ++x << " " << --x << endl;
00DD9718  mov         eax,dword ptr [x]  
00DD971B  sub         eax,1               //先减1
00DD971E  mov         dword ptr [x],eax  
00DD9721  mov         ecx,dword ptr [x]  
00DD9724  add         ecx,1               //再加1
00DD9727  mov         dword ptr [x],ecx  
00DD972A  mov         esi,esp  
00DD972C  push        0DD1406h  
00DD9731  mov         edi,esp  
00DD9733  mov         edx,dword ptr [x]  
00DD9736  push        edx  
00DD9737  push        0DDDD10h  
00DD973C  mov         ebx,esp  
00DD973E  mov         eax,dword ptr [x]  
00DD9741  push        eax  
00DD9742  mov         ecx,dword ptr ds:[0DE10B8h]  
00DD9748  call        dword ptr ds:[0DE109Ch]  
00DD974E  cmp         ebx,esp  
00DD9750  call        __RTC_CheckEsp (0DD1352h)  
00DD9755  push        eax  
00DD9756  call        std::operator<<<std::char_traits<char> > (0DD14FBh)  //输出
00DD975B  add         esp,8  
00DD975E  mov         ecx,eax  
00DD9760  call        dword ptr ds:[0DE109Ch]  
00DD9766  cmp         edi,esp  
00DD9768  call        __RTC_CheckEsp (0DD1352h)  
00DD976D  mov         ecx,eax  
00DD976F  call        dword ptr ds:[0DE1094h]  
00DD9775  cmp         esi,esp  
00DD9777  call        __RTC_CheckEsp (0DD1352h)  
cout << --x << " " << ++x << endl;
00DD9783  mov         eax,dword ptr [x]  
00DD9786  add         eax,1                        //先加1
00DD9789  mov         dword ptr [x],eax  
00DD978C  mov         ecx,dword ptr [x]  
00DD978F  sub         ecx,1                        //再减1
00DD9792  mov         dword ptr [x],ecx  
00DD9795  mov         esi,esp  
00DD9797  push        0DD1406h  
00DD979C  mov         edi,esp  
00DD979E  mov         edx,dword ptr [x]  
00DD97A1  push        edx  
00DD97A2  push        0DDDD10h  
00DD97A7  mov         ebx,esp  
00DD97A9  mov         eax,dword ptr [x]  
00DD97AC  push        eax  
00DD97AD  mov         ecx,dword ptr ds:[0DE10B8h]  
00DD97B3  call        dword ptr ds:[0DE109Ch]  
00DD97B9  cmp         ebx,esp  
00DD97BB  call        __RTC_CheckEsp (0DD1352h)  
00DD97C0  push        eax  
00DD97C1  call        std::operator<<<std::char_traits<char> > (0DD14FBh)  
00DD97C6  add         esp,8  
00DD97C9  mov         ecx,eax  
00DD97CB  call        dword ptr ds:[0DE109Ch]  
00DD97D1  cmp         edi,esp  
00DD97D3  call        __RTC_CheckEsp (0DD1352h)  
00DD97D8  mov         ecx,eax  
00DD97DA  call        dword ptr ds:[0DE1094h]  
00DD97E0  cmp         esi,esp  
00DD97E2  call        __RTC_CheckEsp (0DD1352h)  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值