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

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

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

 

posted on 2017-06-22 23:09  .rdt  阅读(2892)  评论(0编辑  收藏  举报

导航