[英]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.