[英]C Programming : Confusion between operator precedence
我對運算符的優先級感到困惑,想知道如何評估該語句。
# include <stdio.h>
int main()
{
int k=35;
printf("%d %d %d",k==35,k=50,k>40);
return 0;
}
這里k
最初的值為35,當我在printf
測試k
,我認為:
k>40
應檢查為0 k==35
應該被檢查,結果應該為1 k
,並應輸出50 因此最終輸出應為1 50 0
,但輸出為0 50 1
。
您不能依賴此程序的輸出,因為它是undefined behavior
,未在C中指定評估順序,因為這使編譯器可以根據C99
草案標准第6.5
節第3
段進行更好的優化:
語法表示操作符和操作數的分組。74)除非稍后指定(對於函數調用(),&&,||,?:和逗號運算符), 子表達式的求值順序和哪種副作用都未指定。
它也是未定義的,因為您正在訪問k
的值並在同一sequence point
為其分配sequence point
。 從標准草案第6.5
條第2
款:
在上一個序列點與下一個序列點之間,對象的存儲值最多只能通過對表達式的求值來修改。 此外,先驗值應只讀以確定要存儲的值。
它引用了以下未定義的代碼示例:
i = ++i + 1;
a[i++] = i;
更新資料
關於函數調用中的逗號是否充當序列點的評論。 如果我們看6.5.17 Comma operator
節, 6.5.17 Comma operator
第2
段會說:
逗號運算符的左操作數被評估為void表達式; 評估后有一個序列點。
但是第3
段說:
示例如語法所示,逗號運算符(如本小節中所述) 不能出現在使用逗號分隔列表中的項(例如函數的參數或初始化器列表 )的上下文中 。
因此,在這種情況下,逗號不會引入序列點。
未指定函數參數的評估順序。 可以按任何順序對它們進行評估。 編譯器決定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.