為什么Swift和Python要拋棄++\--位喂?

今天來聊一聊栖茉,為什么Swift和Python要拋棄++--纹笼?

原文|<u>地址</u>

簡單好用的++拴签、--

說到自增(++)\自減(--)運算符孝常,小伙伴們應該都不會陌生,在很多編程語言的代碼中蚓哩,都經(jīng)常出現(xiàn)它們的身影构灸。

  • 比如常用的for語句
for (int i = 0; i < n; i++) {
    // TODO
}

  • 比如經(jīng)典的一行代碼實現(xiàn)字符串拷貝
// 將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;
}

使用得當?shù)脑挘栽觯?+)\自減(--)運算符的確可以讓代碼簡潔又優(yōu)雅岸梨。

但是

2大熱門編程語言Swift喜颁、Python并不支持自增(++)稠氮、自減(--)運算符,這是為什么呢半开?

這里先給出幾個參考鏈接隔披,有興趣的小伙伴可以自行去閱讀一下:

這里只列出幾個顯而易見的理由

  • 有了強大又簡潔的for-in寂拆,for語句中可以完全不需要++奢米、--
// 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++);看起來似乎簡單而優(yōu)雅,但對于初學者來說絕非簡單纠永,會增加學習成本鬓长。而SwiftPython更傾向于希望任何人都能快速上手這門編程語言尝江。

  • 當混合使用前綴和后綴的++涉波、--時

    • 會降低代碼的可讀性,比如while (n++ > --k)炭序,經(jīng)驗豐富的程序員也必須停下來思考一下代碼的具體含義是什么
    • 運行結果可能會有不確定性

運行結果的不確定性

下面列出2段代碼啤覆,變量b的結果是什么呢?(值得一提的是:實際開發(fā)中我們并不會這么寫少态,這里把它列出來僅僅是為了討論一些技術細節(jié))

int a, b;

// 第1段代碼
a = 1;
b = a++ + ++a + a++ + ++a;

// 第2段代碼
a = 1;
b = a++ + a++ + a++ + a++;

實際上城侧,上面的C語言代碼在MSVC易遣、MinGW編譯器下得出的結果是不完全一致的

  • MSVC:微軟出品
  • MinGW:GNU出品(可以理解為Windows版本的GCC)

第1段代碼

結果一致彼妻,符合絕大部分人的預期,所以就不展開討論了

a = 1;
b = a++ + ++a + a++ + ++a;
// MSVC:b = 1 + 3 + 3 + 5 = 12
// MinGW:b = 1 + 3 + 3 + 5 = 12

第2段代碼

結果不一致

  • MSVC的結果是1 + 1 + 1 + 1 = 4
  • MinGW的結果是1 + 2 + 3 + 4 = 10
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呢豆茫?根據(jù)最終結果10反推回去猜出來的么侨歉?NO!如果是這樣做的話揩魂,那就有點侮辱了程序員這個職業(yè)了幽邓。

像這種不太容易從表面去理解的代碼,你若想知道它的真正本質火脉,那就要搬出強有力且精準的武器了牵舵,它就是匯編語言(Assembly Language)

簡單說明一下使用匯編語言的理由:

  • 眾所周知倦挂,C語言代碼最終都會被編譯為機器語言代碼(也叫做機器指令畸颅,只由0和1組成)
  • 那通過研究最終的機器指令來探索C語言代碼的本質?由于機器指令極其晦澀難懂方援,因此没炒,對一般人來說,這并不是一種高效的辦法
  • 最佳的辦法是:研究一下介于C語言犯戏、機器語言之間的匯編語言代碼
    • C語言匯編語言 ? 機器語言
    • 匯編語言代碼比機器指令可讀性高很多
    • 每一條機器指令都有與之對應的匯編語言代碼
    • 因此送火,你研究匯編語言代碼拳话,基本就等同于研究機器指令,可讀性+精準性兼具

看看MSVC環(huán)境下的匯編代碼

image
  • 紅框代碼:將4個a相加的結果賦值給b种吸,由于a的初始值是1弃衍,所以b = 1 + 1 + 1 + 1 = 4
  • 綠框代碼:讓a執(zhí)行4次自增1的操作,相當于執(zhí)行4次a += 1

看看MinGW環(huán)境下的匯編代碼

image
  • 為了保證能基本看懂這段匯編代碼坚俗,建議你可以理解為[rbp-0x4]代表變量a笨鸡,[rbp-0x8]代表變量b
  • 綠框代碼:讓a執(zhí)行自增1的操作,相當于執(zhí)行a += 1
  • 紅框代碼:將a每次自增1之前的值累加起來坦冠,最后賦值給b
  • 可以看到形耗,綠框、紅框代碼是交替執(zhí)行的辙浑,所以最終b = 1 + 2 + 3 + 4 = 10

最后2段代碼

最后再放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

根據(jù)前面的一些講解,相信你現(xiàn)在可以推斷出MSVC的結果了判呕。

但MinGW的結果可能還是會讓人感覺到奇怪:它其實是先讓最前面的2個++a執(zhí)行a自增1的操作倦踢,后面的2個++a\a++就照常處理,所以最終b = 3 + 3 + ...

好了侠草,就此打住辱挥,建議不要去糾結這些細節(jié)了,因為本來就不推薦這種寫法边涕。你只需要知道:多個前綴晤碘、后綴的自增自減一起使用時,結果具有不確定性功蜓。

總的來說园爷,++、--是把雙刃劍式撼,再者童社,它并非是編碼過程中必不可缺的,所以被Swift著隆、Python拋棄也是正常的事扰楼。

關于匯編

經(jīng)常看到有人說:匯編語言都是上古時期的編程語言了美浦,沒啥用弦赖,甚至還有人說C\C++這么古老的語言,沒有任何學習價值抵代。我個人并不贊同這些觀點腾节。掌握好匯編,可以更好地了解代碼的本質,掃除一些基本的知識誤區(qū)案腺。

因為時間和篇幅的關系庆冕,這篇文章并沒有詳細解釋每一句匯編代碼的作用。如果你對匯編感興趣劈榨,可以參考以下圖片

image

之前有在B站上傳一些匯編教程访递,有需要的小伙伴可以向公眾號發(fā)送匯編兩字,獲取教程地址

最后的思考題

最后留一道思考題同辣,可以將思考的結果直接留言評論

不是說Python不支持自增(++)\自減(--)運算符么拷姿,為什么下面的Python代碼能運行成功呢?

a = 10
b = ++a

c = a++ + ++a
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末旱函,一起剝皮案震驚了整個濱河市响巢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棒妨,老刑警劉巖踪古,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異券腔,居然都是意外死亡伏穆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門纷纫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枕扫,“玉大人,你說我怎么就攤上這事辱魁⊙糖疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵商叹,是天一觀的道長燕刻。 經(jīng)常有香客問我,道長剖笙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任请唱,我火速辦了婚禮弥咪,結果婚禮上,老公的妹妹穿的比我還像新娘十绑。我一直安慰自己聚至,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布本橙。 她就那樣靜靜地躺著扳躬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贷币,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天击胜,我揣著相機與錄音,去河邊找鬼役纹。 笑死偶摔,一個胖子當著我的面吹牛,可吹牛的內容都是我干的促脉。 我是一名探鬼主播辰斋,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘸味!你這毒婦竟也來了宫仗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旁仿,失蹤者是張志新(化名)和其女友劉穎锰什,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁逝,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡汁胆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霜幼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫩码。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罪既,靈堂內的尸體忽然破棺而出铸题,到底是詐尸還是另有隱情,我是刑警寧澤琢感,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布丢间,位于F島的核電站,受9級特大地震影響驹针,放射性物質發(fā)生泄漏烘挫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一柬甥、第九天 我趴在偏房一處隱蔽的房頂上張望饮六。 院中可真熱鬧,春花似錦苛蒲、人聲如沸卤橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窟扑。三九已至喇颁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚎货,已是汗流浹背橘霎。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厂抖,地道東北人茎毁。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像忱辅,于是被迫代替她去往敵國和親七蜘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容

  • TITLE: 編程語言亂燉 碼農最大的煩惱——編程語言太多墙懂。不是我不學習橡卤,這世界變化快! 有時候還是蠻懷念十幾损搬、二...
    碼園老農閱讀 5,323評論 2 35
  • 學習C++的必要性 得益于它的高效性碧库、穩(wěn)定性、跨平臺性巧勤,所以應用范圍廣泛嵌灰; 是很多語言的老祖宗,理解C++相當理解...
    Stago閱讀 197評論 0 0
  • 作者: Liwx 郵箱: 1032282633@qq.com 源碼: 需要源碼的同學, 可以在評論區(qū)留下您的郵箱 ...
    Liwx閱讀 2,073評論 1 12
  • 什么是Swift Swift颅悉,一種支持多編程范式沽瞭,編譯式編程語言,由蘋果公司推出剩瓶,用來撰寫OS X和iOS應用程序...
    CapJon閱讀 2,194評論 1 9
  • 編程語言主要從以下幾個角度為進行分類,編譯型和解釋型枝缔、靜態(tài)語言和動態(tài)語言布疙、強類型定義語言和弱類型定義語言,每個分類...
    黑猴子的家閱讀 1,286評論 0 2