C语言中自加自减求值

qinmin 发布于 2011/08/16 16:33
阅读 313
收藏 0
#include <stdio.h> 

int main() 
{ 
    int i=8; 
    printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--); 
} 
用GCC编译的答案为8878,VC6编辑的答案为8788,请问这两个答案怎么来的?不是应该是9889吗?等待高手!
加载中
0
兰穆达
兰穆达
GCC从右向左求值,VC6从左向右求值,貌似ANSI没规定求值顺序,所以结果因编译器而异。我试验了另一款编译器,结果是109910,不管你信不信,反正我是信了:)
qinmin
qinmin
谢谢!果真是编译器的问题,正确的答案应该是8778和9889
0
chishaxie
chishaxie
函数参数倒着入栈……VS08 结果8878
0
chishaxie
chishaxie

还是看汇编才是王道

002A13E5 8B 45 F8         mov         eax,dword ptr [i] 

002A13E8 89 85 30 FF FF FF mov         dword ptr [ebp-0D0h],eax 

002A13EE 8B 4D F8         mov         ecx,dword ptr [i] 

002A13F1 83 E9 01         sub         ecx,1 

002A13F4 89 4D F8         mov         dword ptr [i],ecx 

002A13F7 8B 55 F8         mov         edx,dword ptr [i] 

002A13FA 89 95 2C FF FF FF mov         dword ptr [ebp-0D4h],edx 

002A1400 8B 45 F8         mov         eax,dword ptr [i] 

002A1403 83 C0 01         add         eax,1 

002A1406 89 45 F8         mov         dword ptr [i],eax 

002A1409 8B 4D F8         mov         ecx,dword ptr [i] 

002A140C 83 E9 01         sub         ecx,1 

002A140F 89 4D F8         mov         dword ptr [i],ecx 

002A1412 8B 55 F8         mov         edx,dword ptr [i] 

002A1415 83 C2 01         add         edx,1 

002A1418 89 55 F8         mov         dword ptr [i],edx 

002A141B 8B F4            mov         esi,esp 

002A141D 8B 85 30 FF FF FF mov         eax,dword ptr [ebp-0D0h] 

002A1423 50               push        eax  

002A1424 8B 8D 2C FF FF FF mov         ecx,dword ptr [ebp-0D4h] 

002A142A 51               push        ecx  

002A142B 8B 55 F8         mov         edx,dword ptr [i] 

002A142E 52               push        edx  

002A142F 8B 45 F8         mov         eax,dword ptr [i] 

002A1432 50               push        eax  

002A1433 68 3C 57 2A 00   push        offset string "%d\n%d\n%d\n%d\n" (2A573Ch) 

002A1438 FF 15 BC 82 2A 00 call        dword ptr [__imp__printf (2A82BCh)] 

002A143E 83 C4 14         add         esp,14h 

002A1441 3B F4            cmp         esi,esp 

002A1443 E8 F8 FC FF FF   call        @ILT+315(__RTC_CheckEsp) (2A1140h) 

0
xunxun
xunxun
编程要避免这种写法,不同编译器规则不一样,这个也不是语言标准
返回顶部
顶部