# 前置++和前置--
先看一段代碼? ?
大家是不是認為printf輸出的是?
2? 3? 3?
2? 1? 1
但是實際輸出的是
3? 3? 3
1? 1? 1?
?在這兩行printf函數代碼里,編譯器會先計算 ++a 和 --a 的值,然后再? 從右向左 開始輸出。?
?printf函數中,如果有多個 前置++?或者 前置-- ,先 從右向左 計算最終的值,再 從右向左 輸出最終的值
?printf 函數中,如果 前置++?與 前置-- 同時存在,會像上面的例子,先 從右向左 按順序計算出最終的值,再 從右向左 輸出最終的值
# 后置++ 和 后置--
先看這段代碼
從上面的代碼可以得知:
printf函數會從最右邊的帶有 后置++ 或 后置-- 的代碼 開始運行輸出,然后再跳到下一個帶有 后置++ 或 后置-- 的代碼 運行輸出,計算出最終的值后再 從右向左 向沒有帶++或--的代碼 輸出最終的值.
a = 2;
printf("%d %d %d\n", a++,? ? ?a? ?,? ?a++);??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1) (2) (3)
( 后置-- 和 后置++ 與 后置-- 混合 也是如此)就比較如這個例子:
? ?第(3)的?a++ 會先運行輸出 2 ,然后加 1 變成 3 ;
? ?之后跳到(1)的?運行輸出 3 ,然后 加 1 變成 4 ;
? ?左邊已經沒有帶有 后置++ 的a,這時候 編譯器就會從 最右邊開始 向左沒有帶 操作符的a 輸出? ? ???最終的值,即 4 ;
? ?最終的輸出結果就為 3 4 2
# 后置++、后置-- 與 前置++、前置-- 混合
?這里先說 運行法則:前置類型運行不打印;后置類型即打印也運行;無符號類型的和前置類型的等到 從右到左 計算完最終值后打印最終值。
用上面的例子來說明
首先,還是從最右邊帶符號的開始?從右向左 計算 帶符號的代碼:
?從第(5)--a 開始計算,先運行 --符 ——>?a -?1,計算后?a = 1,因為 --a 是前置類型,這時不輸出打印;
?第(4)a-- 帶有符號,是后置類型,先打印前面傳來的 1,再運行 -- 符 —> a?- 1, 計算后a = 0;
?第(3)++a 帶有符號 ,前置類型,先運行 ++符 ——> a = 1, 計算后 a = 1,因為 ++a 是前置類型,這時不輸出打印;
?第(2)a 不帶符號跳過它,來到帶有符號的第(1)a++,后置類型,先打印前面傳來的 1,再運行 ++?符 —> a +?1, 計算后a = 2;
?到這我們已經計算出后值類型?:第(4)a--的值 1和第(1)a++的值1了;和最終的值 2 了
?接下就輸出無符號類型的和前置類型的值,從右到左 打印最終值 2?