我想知道哪些標準,gcc編譯器決定優化變量的值。 這裏是樣品gcc優化前增量和後增量
int a=2;
printf("%d %d\n",a++,++a);
它使輸出 3 4
爲什麼gcc的優化和給出預增量,而不是在後增量的a
最新值?在此基礎上所花費的決定呢?
我想知道哪些標準,gcc編譯器決定優化變量的值。 這裏是樣品gcc優化前增量和後增量
int a=2;
printf("%d %d\n",a++,++a);
它使輸出 3 4
爲什麼gcc的優化和給出預增量,而不是在後增量的a
最新值?在此基礎上所花費的決定呢?
這是未定義的行爲。沒有指定參數的評估順序。
該代碼有兩個問題。
你在同一個表情的改變a
值的兩倍,它們之間沒有所謂的「序列點」。這是未定義的行爲任何事情都可能發生。 See the FAQ for more information。
您在傳遞給函數的參數中有副作用,副作用是++增量。函數參數的評估順序是未指定的行爲,這意味着編譯器已經以某種方式實現了它,但我們不知道如何實現。它可能與功能不同,但從編譯器到編譯器肯定不同。
一個應該從不依靠不確定的或不確定的行爲寫代碼。 Even more info in the FAQ。
這是未定義的行爲,因爲a在同一個表達式中被更改了兩次,中間沒有序列點。函數參數的求值順序不是UB,它是_unspecified behavior_。這是兩個不同的問題。 – Lundin