1. 程式人生 > >後置++和解引用*的優先級

後置++和解引用*的優先級

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‘ -> *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有其他操作,後綴++先使用值的特性立馬顯現。

這就出現了匯編代碼中解引用*優先級大於後置++的假象。

後置++和解引用*的優先級