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)