深度解析自加自減運算 ++ --

關於自減自減運算,這是一個比較讓人糾結的問題。

初級認識

int i=3;
int j;
j=i++;或者j=++i;

當爲前者時 先把i的值賦予j,然後i++。

當爲後者時先把i自加,然後把i賦予j。

爲什麼是這樣子的呢?因爲當編譯器解析這個表達式時,運算符有兩個,一個“= ”一個“++”。因爲++優先級比較高,所以應該先做運算,但是該符號的結合方向是由右向左,當j=i++時,++右邊是沒有變量的。所以i沒有一開始就自加。當所有運算結束時,i才自加。

中級認識

int i=3;
int j;
j=i++ + ++i;或者j=++i + ++i;或者j=i++ + i++;

第一種情況,爲j=4+4=8,i=5.

第二種情況,爲j=5+5=10,i=5;

第三種情況,爲j=3+3=6,i=5;

爲什麼是這個樣子呢?還是從編譯器解析表達式談起,運算符有四個:兩個“++”,一個“=”,一個“+"。按照優先級應該先運算++,再運算+,再運算=。考慮到++的結合方向,所以當++位於自變量的右側時,自變量不變。當位於自變量左側時自變量先進行運算。考慮系統只爲自變量i分配了唯一的內存空間,對於第一種情況先考慮的是 i++和++i,i++沒有改變i的值,i++是的i=4,編譯器會,當編譯器從內存中讀取i的值賦予i++時,i的值早已變成了4.所以會有j=4+4=8。第二種情況++i和++i,系統會將i的值加1,存回i存儲空間。在從i存儲空間讀出,自加1,再存回i存儲空間。現在i的內存空間值已變成5.系統從i內存空間中讀取值相加,得到j=5+5=10.第三種情況 i++和i++,++在右側,變量i不做處理。直接從i存儲空間取值相加,得到j=3+3=6。最後纔對i進行兩次自加。

深度認知

(++i)+=(i++);
(++i)=(++i)+(i++);
不等效。第一種情況爲11,第二種情況爲13.

發佈了43 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章