后置++和解引用*的优先级

char* p = "worldcup";
*p++ = 'a';

 

其中,*p++ = 'a'执行顺序,涉及到后置++和解引用*的优先级问题:

;19:       char* p = "worldcup";
mov         dword ptr [ebp-0Ch],offset string "worldcup" 

;20:       *p++ = 'a';
mov         eax,dword ptr [ebp-0Ch]  ; p -> eax
mov         byte ptr [eax],61h       ;  'a' -> *eax 即 'a' -> *p
mov         ecx,dword ptr [ebp-0Ch]  ; p -> ecx
add         ecx,1                    ; ecx += 1;
mov         dword ptr [ebp-0Ch],ecx  ; ecx -> p

可见是先执行*p = 'a',再执行p += 1,似乎说明解引用*的优先级大于后置++。

 

可是如果你去查看运算符优先级表就会发现,后置++的优先级是高于解引用*的。

也就是说*p++实际上是*(p++),这是怎么回事呢?

如果两个运算符被用于同一个操作数,则首先结合优先级最高的运算符。这意味着后置++将对p进行操作,而不是对*p进行操作。

 

而后缀++的特性,不就是先使用当前值吗?所以加1的操作只能放到后面了。

单独的*p++是看不出什么名堂的:

;20:       *p++;
mov         eax,dword ptr [ebp-0Ch]
add         eax,1
mov         dword ptr [ebp-0Ch],eax

然而一旦对p有其他操作,后缀++先使用值的特性立马显现。

这就出现了汇编代码中解引用*优先级大于后置++的假象。

 

转载于:https://www.cnblogs.com/rdt2017/p/7067728.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值