後置++和解引用*的優先級
阿新 • • 發佈:2017-06-23
har 進行 運算符優先級 word 可見 執行 span str fse
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‘ -> *pmov 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有其他操作,後綴++先使用值的特性立馬顯現。
這就出現了匯編代碼中解引用*優先級大於後置++的假象。
後置++和解引用*的優先級