标签:执行 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