簡體   English   中英

C編程:運算符優先級之間的混淆

[英]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 ,我認為:

  1. k>40應檢查為0
  2. k==35應該被檢查,結果應該為1
  3. 最后,應將50分配給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 operator2段會說:

逗號運算符的左操作數被評估為void表達式; 評估后有一個序列點。

但是第3段說:

示例如語法所示,逗號運算符(如本小節中所述) 不能出現在使用逗號分隔列表中的項(例如函數的參數或初始化器列表 )的上下文中

因此,在這種情況下,逗號不會引入序列點。

未指定函數參數的評估順序。 可以按任何順序對它們進行評估。 編譯器決定。

這是未定義的行為

您可能會獲得任何價值。 在兩個連續執行中缺少序列點 提高警告的嚴格性級別,您會得到warning: operation on 'k' may be undefined

暫無
暫無

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

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