簡體   English   中英

你能解釋輸出嗎?

[英]Can you explain the Output?

以下代碼的輸出應該是什么?為什么? 我有點困惑。

int a =10;
printf("%d %d %d",a,a=a+10,a);

輸出是不確定的,因為a=a+10是副作用,編譯器可以在任何其他參數之前或之后自由地評估它。

編輯:正如大衛指出的那樣,行為實際上是未定義的 ,這意味着所有的賭注都已關閉,你永遠不應該編寫這樣的代碼。 在實踐中,編譯器幾乎總是會做一些看似合理且不可預測的事情,甚至可能在調試和優化構建之間有所不同。 我認為抹香鯨不是一種可能的結果。 牽牛花? 也許。

函數調用f(a,b,c) a,b和c的求值順序未指定。

閱讀序列點以獲得更好的想法:(在這種特殊情況下未定義的行為不是由於序列點。感謝@stusmith指出這一點)

命令式編程中的序列點定義了計算機程序執行中的任何點,在該點處保證先前評估的所有副作用都已執行,並且尚未執行后續評估的副作用。 它們經常在引用C和C ++時被提及,因為某些表達式的結果可能取決於它們的子表達式的評估順序。 添加一個或多個序列點是確保結果一致的一種方法,因為這會限制可能的評估順序。

當同一個變量被多次修改時,序列點也會發揮作用。 一個經常被引用的例子是表達式i=i++ ,它既賦予i自身又增加i ; 什么是最終價值i 語言定義可能指定一種可能的行為,或者只是說行為未定義。 在C和C ++中,評估這樣的表達式會產生不確定的行為

謝謝你的答案.... :)行為是真的未定義和編譯器相關。 這是一些輸出

用Turbo編譯c:20 20 10

用Visual Studio c ++編譯:20 20 20

用CC編寫:20 20 20

用gcc編譯:20 20 20

用dev c ++編譯:20 20 10

沒有定義的。
功能參數的評估順序不是由標准定義的。
所以這個輸出可能是任何東西。

在Bloodshed Dev C ++中使用Mingw Compiler:20 20 10

不是為了修改以前的正確答案,而是提供一些額外的信息:根據標准,即使這樣也是未定義的:

int a =10;
printf("%d %d %d", a = 20, a = 20, a = 20);

高度依賴於編譯器

因為參數的評估順序不是由標准指定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM