C#中的++与C++中的++结果不一致

在C# 中使用一段代码:

int a= 4;

a += a++;

结果a为8;但在C++中结果为9;

检查汇编代码

C# :

0     mov         dword ptr [rsp+20h],4

1     mov         ecx,dword ptr [rsp+20h] 

2     add         ecx,1                                 //ecx 为5

3     mov         eax,dword ptr [rsp+20h]  //eax为4

4     mov         dword ptr [rsp+24h],eax  

5     mov         eax,dword ptr [rsp+20h] //eax为4

6     mov         dword ptr [rsp+28h],eax 

7     mov         dword ptr [rsp+20h],ecx   // a为5

8     mov         ecx,dword ptr [rsp+28h]  //ecx为4

9     mov         eax,dword ptr [rsp+24h] //eax为4

10     add         eax,ecx                         //eax为8

11     mov         dword ptr [rsp+20h],eax // a为8

可以看的add指令是废弃的,对结果根本没有影响。

C++中:

0     mov         dword ptr [ebp-44h],4

1     mov         eax,dword ptr [ebp-44h] 

2     add         eax,dword ptr [ebp-44h]  //eax为8

3     mov         dword ptr [ebp-44h],eax //a为8

4     mov         ecx,dword ptr [ebp-44h] //ecx为8

5     add         ecx,1                                 //ecx为9

6     mov         dword ptr [ebp-44h],ecx //a为9

指令的执行顺序是先add为8,然后+1,最终值为9,而且改成a += (a++);执行顺序仍然如此,感觉上好像C++中+=的优先级比++高一样。

///

修改一下

int a= 4;

a += ++a;

结果C#中a为9;C++中结果为10;

C# 汇编指令

mov         dword ptr [rsp+20h],4 

mov         eax,dword ptr [rsp+20h] 

add         eax,1                                 //eax 为5

mov         dword ptr [rsp+2Ch],eax 

mov         ecx,dword ptr [rsp+2Ch]  //ecx为5

mov         eax,dword ptr [rsp+20h] //eax为4

mov         dword ptr [rsp+30h],eax 

mov         dword ptr [rsp+20h],ecx  //a为5

mov         ecx,dword ptr [rsp+30h]  //ecx4

mov         eax,dword ptr [rsp+2Ch] //eax为5

add         eax,ecx 

mov         dword ptr [rsp+20h],eax //a为9

C++汇编指令

mov         dword ptr [ebp-44h],4 

mov         eax,dword ptr [ebp-44h]  

add         eax,1                             //eax 为5

mov         dword ptr [ebp-44h],eax  //a为5

mov         ecx,dword ptr [ebp-44h]    //ecx 为5

add         ecx,dword ptr [ebp-44h]    //ecx 为10

mov         dword ptr [ebp-44h],ecx  //a为10

这问题到底算谁的?以后编码还是不要用这些个理解困难,又结果容易出错的代码吧!

转载于:https://my.oschina.net/jjfcplusplus/blog/419385

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值