一個關於不同編譯器對operator++和operator+=的處理方式的問題

首先,上代碼:

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
	int a = 5;
	printf("a++ = %d\n", a++);

	a = 5;
	printf("++a = %d\n", ++a);

	a = 5;
	printf("a += a++  =%d\n", a += a++);
	a = 5;
	printf("a += (a++)  =%d\n", a = a + (a++));

	a = 5;
	printf("a += ++a  =%d\n", a += ++a);
	a = 5;
	printf("a += (++a)  =%d\n", a += (++a));

	a = 5;
	printf("++a += a++ =%d\n", ++a += a++);
	a = 5;
	printf("(++a) += (a++) =%d\n", (++a) += (a++));

	return 1;
}
不知道各位看官看到這兒有什麼想法,你認爲它們的輸出值應該是什麼?


不賣關子了,直接給出VS2013下的運行結果和g++ 4.8.2編譯出的運行結果:


如此截然不同的結果,那麼我們看一下彙編代碼(只截取了【printf("a += a++  =%d\n", a += a++);】部分的彙編作爲示例,具體的大家可以自己看一下):

/* vs2013 */
    13: 	printf("a += a++  =%d\n", a += a++);
011ECAC7  mov         eax,dword ptr [a]  
011ECACA  add         eax,dword ptr [a]  
011ECACD  mov         dword ptr [a],eax  
011ECAD0  mov         ecx,dword ptr [a]  
011ECAD3  mov         dword ptr [ebp-0D0h],ecx  
011ECAD9  mov         edx,dword ptr [a]  
011ECADC  add         edx,1  
011ECADF  mov         dword ptr [a],edx  
011ECAE2  mov         esi,esp  
011ECAE4  mov         eax,dword ptr [ebp-0D0h]  
011ECAEA  push        eax  
011ECAEB  push        11F832Ch  
011ECAF0  call        dword ptr ds:[11FC1E4h]  
011ECAF6  add         esp,8  
011ECAF9  cmp         esi,esp  
011ECAFB  call        __RTC_CheckEsp (011E1631h)  


/* g++ 4.8.2 */
13		printf("a += a++  =%d\n", a += a++);
   0x08048602 <+85>:	mov    0x1c(%esp),%eax
   0x08048606 <+89>:	lea    0x1(%eax),%edx
   0x08048609 <+92>:	mov    %edx,0x1c(%esp)
   0x0804860d <+96>:	add    %eax,0x1c(%esp)
   0x08048611 <+100>:	mov    0x1c(%esp),%eax
   0x08048615 <+104>:	mov    %eax,0x4(%esp)
   0x08048619 <+108>:	movl   $0x8048814,(%esp)
   0x08048620 <+115>:	call   0x80484a0 <printf@plt>

我書讀得少,彙編更是自學成才,希望大家能幫忙解釋一下是神馬情況~~~,小弟多謝了!

【注】上述代碼運行平臺均爲32位操作系統,其中vs2013運行於Windows 8.1 企業版,g++運行於ubuntu14.04 (3.13.0-41-generic)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章