MSVC和gcc得到不同结果

来源:互联网 发布:通达信mac版公式 编辑:程序博客网 时间:2024/04/27 13:16
写了个小程序,在MSVC 2008 和 gcc 3.4.4 ( under cygwin)下面跑了一下,
发现结果不一样。
     gcc 3.4.4:                          1
     gcc 4.5.2                2             2
    MSVC:                               2
   http://codepad.org:    编译失败!!!

代码如下,非常简单:

//  ------------ source code-------------------------------
#include "stdio.h"

int main()
{
    int i =0;
    //i++;
#if 1
    i =(++i)*(i++);
   printf("i=%d\r\n",i);

    i = 0;
    i =(i++)*(++i);
   printf("i=%d\r\n",i);
#endif

    return1;
}
------------------- asm code in MSVC--------------------------------------------------
// in MSVC, their asm code are the same. And before get back data,the operation is:
            004113DB  add       edx,1 
表示加1了。
--------------------------------------------------------     
    i =(++i)*(i++);
004113C5  mov        eax,dwordptr [i] 
004113C8  add       eax,1 
004113CB  mov        dword ptr[i],eax 
004113CE  mov        ecx,dwordptr [i] 
004113D1  imul       ecx,dwordptr [i] 
004113D5  mov        dword ptr[i],ecx 
004113D8  mov        edx,dwordptr [i] 
004113DB  add       edx,1 
004113DE  mov        dword ptr[i],edx 
   printf("i=%d\r\n",i);
004113E1  mov       esi,esp 
004113E3  mov        eax,dwordptr [i] 
004113E6  push       eax 
004113E7  push       offsetstring "i=%d\r\n" (41573Ch) 
004113EC  call       dword ptr[__imp__printf (4182BCh)] 
004113F2  add       esp,8 
004113F5  cmp       esi,esp 
004113F7  call      @ILT+310(__RTC_CheckEsp)(41113Bh) 

    i =0;
004113FC  mov        dword ptr[i],0 
    i =(i++)*(++i);
00411403  mov        eax,dwordptr [i] 
00411406  add       eax,1 
00411409  mov        dword ptr[i],eax 
0041140C  mov        ecx,dwordptr [i] 
0041140F  imul       ecx,dwordptr [i] 
00411413  mov        dword ptr[i],ecx 
00411416  mov        edx,dwordptr [i] 
00411419  add       edx,1 
0041141C  mov        dword ptr[i],edx 

-----------------------------------------------------------
在最新的编译器上:
1.
    i =1; 
    j =(i++) + ( i ++) + ( i++) + ...+ (i++);  //N个
     = N;
    最后 i =1 + N;

2.  
    i =1; 
    j = (++i) +(++i) + (++i) + ...+ (++i);  // N个
     = N * ( N + 1); // 不是 2 + 3 + 4 + 5 + 。。 +(N+1)
    最后 i = 1 +N;

0 0
原创粉丝点击