簡體   English   中英

條件表達式作為printf的參數

[英]Conditional expressions as arguments to printf

所以我遇到了以下C語言代碼

foo() {                     
    int v=10;
    printf("%d %d %d\n", v==10, v=25, v > 20);
}

它返回0 25 0誰能解釋我如何以及為什么

printf("%d %d %d\n", v==10, v=25, v > 20);

您看到的是未定義的行為,因為未定義printf()的求值順序。

輸出可以解釋為(從右到左評估)

v = 10 and hence v>20 is false so last `%d` prints 0
v = 25 Now v is 25 so second `printf()` prints out 25

那你有

v ==10這是錯誤的,因為v現在是25。 這不是評估的定義順序,可能會有所不同,因此這是UB

從右到左進行評估...

首先,它計算v > 20為假,因此輸出0

接下來設置v=25並打印

接下來,檢查v is 10 其為false,因此輸出0(在上述步驟中更改了v的值)

編輯

這是您的編譯器評估它的方式,但是通常不定義回避的順序

您的代碼受到未定義的行為的約束。 在您的平台上看起來像

v > 20首先得到評估,然后是
v=25 ,然后是
v==10

這是完全符合標准的行為。

請記住,這些表達式可以按任何順序進行求值,並且仍然是符合標准的行為。

您的編譯器似乎從右到左評估函數參數。

因此,首先評估v > 20 ,然后評估v=25 ,然后評估v==10

因此,您得到輸出0 25 0

暫無
暫無

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

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