說到自增(++)\自減(--)運算符,小夥伴們應該都不會陌生,在不少編程語言的代碼中,都常常出現它們的身影。html
for (int i = 0; i < n; i++) { // TODO }
// 將src的內容拷貝至dest void strcpy(char *dest, char *src) { while (*dest++ = *src++); } int main() { char s1[10], *s2 = "xmg_mj"; strcpy(s1, s2); printf("%s", s1); // xmg_mj return 0; }
使用得當的話,自增(++)\自減(--)運算符的確可讓代碼簡潔又優雅。python
2大熱門編程語言Swift、Python並不支持自增(++)、自減(--)運算符,這是爲何呢?c++
這裏先給出幾個參考連接,有興趣的小夥伴能夠自行去閱讀一下:git
Swift之父Chris Lattner的說明程序員
來自Stack Overflow的一個問答github
來自Google研發總監(Director of Research)Peter Norvig的觀點編程
這裏只列出幾個顯而易見的理由swift
// C++ for (int i = 0; i < 5; i++) { cout << i << endl; } // Swift for i in 0..<5 { println(i) } // Python for i in range(5): print(i)
儘管while (*d++ = *s++);看起來彷佛簡單而優雅,但對於初學者來講絕非簡單,會增長學習成本。而Swift、Python更傾向於但願任何人都能快速上手這門編程語言。app
當混合使用前綴和後綴的++、--時編程語言
下面列出2段代碼,變量b的結果是什麼呢?(值得一提的是:實際開發中咱們並不會這麼寫,這裏把它列出來僅僅是爲了討論一些技術細節)
int a, b; // 第1段代碼 a = 1; b = a++ + ++a + a++ + ++a; // 第2段代碼 a = 1; b = a++ + a++ + a++ + a++;
實際上,上面的C語言代碼在MSVC、MinGW編譯器下得出的結果是不徹底一致的
結果一致,符合絕大部分人的預期,因此就不展開討論了
a = 1; b = a++ + ++a + a++ + ++a; // MSVC:b = 1 + 3 + 3 + 5 = 12 // MinGW:b = 1 + 3 + 3 + 5 = 12
結果不一致
a = 1; b = a++ + a++ + a++ + a++; // MSVC:b = 1 + 1 + 1 + 1 = 4 // MinGW:b = 1 + 2 + 3 + 4 = 10
你可能好奇:你怎麼知道MinGW的計算過程是1 + 2 + 3 + 4呢?根據最終結果10反推回去猜出來的麼?NO!若是是這樣作的話,那就有點侮辱了程序員這個職業了。
像這種不太容易從表面去理解的代碼,你若想知道它的真正本質,那就要搬出強有力且精準的武器了,它就是彙編語言(Assembly Language)。
簡單說明一下使用彙編語言的理由:
看看MSVC環境下的彙編代碼
看看MinGW環境下的彙編代碼
最後再放2段代碼出來,在MSVC和MinGW下的結果也是不一致的
a = 1; b = ++a + ++a + ++a + ++a; // MSVC:b = 5 + 5 + 5 + 5 = 20 // MinGW: b = 3 + 3 + 4 + 5 = 15 a = 1; b = ++a + ++a + a++ + a++; // MSVC:b = 2 + 3 + 3 + 4 = 12 // MinGW:b = 3 + 3 + 3 + 4 = 13
根據前面的一些講解,相信你如今能夠推斷出MSVC的結果了。
但MinGW的結果可能仍是會讓人感受到奇怪:它實際上是先讓最前面的2個++a執行a自增1的操做,後面的2個++a\a++就照常處理,因此最終b = 3 + 3 + ...
好了,就此打住,建議不要去糾結這些細節了,由於原本就不推薦這種寫法。你只須要知道:多個前綴、後綴的自增自減一塊兒使用時,結果具備不肯定性。
總的來講,++、--是把雙刃劍,再者,它並不是是編碼過程當中必不可缺的,因此被Swift、Python拋棄也是正常的事。
常常看到有人說:彙編語言都是上古時期的編程語言了,沒啥用,甚至還有人說C\C++這麼古老的語言,沒有任何學習價值。我我的並不贊同這些觀點。掌握好彙編,能夠更好地瞭解代碼的本質,掃除一些基本的知識誤區。
由於時間和篇幅的關係,這篇文章並無詳細解釋每一句彙編代碼的做用。若是你對彙編感興趣,能夠參考如下圖片
以前有在B站上傳一些彙編教程,有須要的小夥伴能夠向公衆號發送彙編兩字,獲取教程地址
最後留一道思考題,能夠將思考的結果直接留言評論
不是說Python不支持自增(++)\自減(--)運算符麼,爲何下面的Python代碼能運行成功呢?
a = 10 b = ++a c = a++ + ++a
若是你特別但願我寫點什麼方面的內容,也能夠留言建議,謝謝
歡迎關注