MSVC和gcc得到不同结果

写了个小程序,在MSVC 2008 和 gcc 3.4.4 ( under cygwin)下面跑了一下,
发现结果不一样。
      gcc 3.4.4:                   1               1
      gcc 4.5.2                     2               2
      MSVC:                         2               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

      return 1;
}
------------------- 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,dword ptr [i] 
004113C8   add         eax,1 
004113CB   mov         dword ptr [i],eax 
004113CE   mov         ecx,dword ptr [i] 
004113D1   imul         ecx,dword ptr [i] 
004113D5   mov         dword ptr [i],ecx 
004113D8   mov         edx,dword ptr [i] 
004113DB  add         edx,1 
004113DE   mov         dword ptr [i],edx 
      printf("i=%d\r\n",i);
004113E1   mov         esi,esp 
004113E3   mov         eax,dword ptr [i] 
004113E6   push         eax  
004113E7   push         offset string "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,dword ptr [i] 
00411406   add         eax,1 
00411409   mov         dword ptr [i],eax 
0041140C   mov         ecx,dword ptr [i] 
0041140F   imul         ecx,dword ptr [i] 
00411413   mov         dword ptr [i],ecx 
00411416   mov         edx,dword ptr [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;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值