C#与C++对语句(i++ + i++)编译的不同

10 篇文章 0 订阅

学习C++同时又在使用C#的朋友注意了,下面简单语句在C#与C++中结果完全不同。

C#
-------------------------------------
int i = 10;
int val = (i++) + i++;
// val = 21, i = 12;

C++
-------------------------------------
int i = 10;
int val = (i++) + i++;
// val = 20, i = 12;

我们下看一下反汇编代码,两个编译器是怎么做的


C#
-----------------------------------------------
0000000e  mov         dword ptr [ebp-0Ch],0 ;给变量 val 赋0值
00000015  mov         esi,0Ah                           ; i = 10; ==> ESI
   int val = i++ + i++;    
0000001a  mov         ebx,esi                           ;ESI = 10; EBX <= ESI
0000001c  inc         esi                                     ;ESI = 11;
0000001d  mov         edi,esi                           ;EDI <= ESI,  EDI == 11
0000001f  inc         esi                                     ;ESI = 12
00000020  add         ebx,edi                          ; EBX  = EDI + EBX = 11 + 10 == 21
00000022  mov         dword ptr [ebp-0Ch],ebx ; val = 21

C++
----------------------------------------------
 int i = 10;
00411A1E  mov         dword ptr [i],0Ah
 int val = i++ + i++;
00411A25  mov         eax,dword ptr [i]
00411A28  add         eax,dword ptr [i] ;          直接计算 i + i
00411A2B  mov         dword ptr [val],eax
00411A2E  mov         ecx,dword ptr [i]
00411A31  add         ecx,1                               ; 计算 i = i + 1
00411A34  mov         dword ptr [i],ecx
00411A37  mov         edx,dword ptr [i]
00411A3A  add         edx,1                              ;又计算i = i + 1
00411A3D  mov         dword ptr [i],edx

通过上面汇编片断看出,
C#编译器对i++理解为: 不论是否在一条语句里,i的值被取完之后,都被加1.
C++编译器对i++理解为:只有在一条完全语句执行完毕后,才进行i = i + 1运算。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值