码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-06-22 23:55:58      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:执行   str   pre   而不是   bsp   set   说明   顺序   运算符   

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有其他操作,后缀++先使用值的特性立马显现。

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

 

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

标签:执行   str   pre   而不是   bsp   set   说明   顺序   运算符   

原文地址:http://www.cnblogs.com/rdt2017/p/7067728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!