2013-10-01 196 views
-2

我想知道哪些標準,gcc編譯器決定優化變量的值。 這裏是樣品gcc優化前增量和後增量

int a=2; 
printf("%d %d\n",a++,++a); 

它使輸出 3 4

爲什麼gcc的優化和給出預增量,而不是在後增量的a最新值?在此基礎上所花費的決定呢?

回答

3

這是未定義的行爲。沒有指定參數的評估順序。

+3

這是未定義的行爲,因爲a在同一個表達式中被更改了兩次,中間沒有序列點。函數參數的求值順序不是UB,它是_unspecified behavior_。這是兩個不同的問題。 – Lundin

3

該代碼有兩個問題。

  • 你在同一個表情的改變a值的兩倍,它們之間沒有所謂的「序列點」。這是未定義的行爲任何事情都可能發生。 See the FAQ for more information

  • 您在傳遞給函數的參數中有副作用,副作用是++增量。函數參數的評估順序是未指定的行爲,這意味着編譯器已經以某種方式實現了它,但我們不知道如何實現。它可能與功能不同,但從編譯器到編譯器肯定不同。

一個應該從不依靠不確定的或不確定的行爲寫代碼。 Even more info in the FAQ