注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:4.4.5
一、++,--操作符的本質
1)++和--操作符對應兩條彙編指令
- 前置(先遞增,再使用數值)
*變數自增(減)1
*取變數值
- 後置(先使用數值,再遞增)
*取變數值
*變數自增(減)1
二、++,--操作符使用分析
1)一對令人頭疼的兄弟
int i = 0;
(i++)+(i++)+(i++);
(++i)+(++i)+(++i);
你覺得這兩個表示式的值分別是什麼?
例項分析
令人頭疼的兄弟
17-1.c
#include int main()
三、++,--操作符使用分析
1)c語言中只規定了++和--對應指令的相對執行次序
2)++和--對應的彙編指令不一定連續執行
3)在混合運算中,++和--的彙編指令可能被打斷執行
++和--參與混合運算結果是不確定的。
警告:結果不確定,依賴於編譯器,要想學好一門語言必須深入了解編譯器。
4)筆試面試中的"奇葩"題
- 編譯器處理的每個符號應該盡可能多的包含字元
- 編譯器以從左向右的順序乙個乙個盡可能多的讀入字元
- 當讀入的字元不可能和已讀入的字元組合成合法符號為止
理解:盡可能多的讀入字元,組成合法使用的符號
例如,a+++b ===> (a++)+b
例項分析
貪心法閱讀示例
17-2.c
#include int main()
空格可以作為c 語言中乙個完整符號的休止符,編譯器讀入空格後立即對之前讀入的符號進行處理
注意:難怪敲**時有些時候要空格,尤其是運算。
小結:1)++和-- 操作符在混合運算中的行為可能不同
2)編譯器通過貪心法處理表示式中的子表示式
3)空格可以作為c語言中乙個完整符號的休止符
4)編譯器讀入空格後立即對之前讀入的符號進行處理
C 17 和 操作符分析
後置int i 0 i i i i i i 兩個表示式的值分別會是多少呢?例項分析 令人頭疼的兄弟 include int main 輸出 1 vc i 3 r 0 i 6 r 18 輸出 2 gcc i 3 r 0 i 6 r 16 分析 1 彙編 vc r i i i mov eax,dword...
C語言學習記錄17 和 操作符分析
和 操作符對應兩條彙編指令。1 前置 變數自增 減 1 取變數值 2 後置 取變數值 變數自增 減 1 vs和gcc不同 灰色地帶 結果分析 vs先加後自增。為什麼結果不確定?1 c語言中只規定了 和 對應指令的相對執行程式 2 和 對應的彙編指令不一定連續執行 3 在混合運算中,和 的彙編指令可能...
前置操作符和後置操作符
操作符可以被過載 全域性函式和成員函式均可以進行過載 過載前置 操作符不需要額外的引數 過載後置 操作符需要乙個int型別的佔位引數 來看乙個例子 include include using namespace std class test intvalue test operator test o...