簡體   English   中英

C 中的變量賦值與逗號運算符

[英]Variable assignments in C with comma operator

考慮到以下陳述,我在這里閱讀了很多問題,但找不到我的答案:

int x;
x = 1, 2, 3;

這給出了 x 值為 1 但是因為還有其他值由 分隔,為什么 rest 被丟棄? 不應該是3嗎? 還是因為= over ,的優先級?

那么如果我寫

int x = 1, 2, 3;

現在它不編譯。 兩者之間的真正區別是什么?

您已經發現=具有更高的precedence 因此,第一個代碼類似於

(x = 1),2, 3;

這意味着您有一個分配,並且您有 2 個由逗號運算符組合的值。

賦值被評估為1 (除了實際為x賦值),你得到一個像這樣的表達式: 1,2,3; 它被評估但被忽略。

在您的第二個片段中,情況有所不同。

int x =1, 2, 3;

優先級再次相同。

如果添加括號int x = (1,2,3); 您將按預期獲得價值3

沒有括號,編譯器需要您要在此處定義的下一個變量的名稱。 23不是定義變量的有效標識符,因此編譯器會抱怨。

x = 1, 2, 3;

由於優先級,這被解釋為(x = 1), 2, 3; .

int x = 1, 2, 3;

在表達式語句中,例如x = 1, 2, 3; , 你可以使用任何表達式 但是,在聲明中,初始化程序只能是賦值表達式(或{}內的初始化程序列表)。

正式的 C 語法的編寫方式,表達式的頂級運算符可以是 C 運算符中的任何一個,但賦值表達式的頂級運算符可以是除 Z0D61F8370CAD4D4D412F80B84D ,的任何一個運算符。 因此,如果在解析初始化器的頂層時看到 a ,則它不能是初始化器的一部分,因此它會結束初始化器。 (A ,可以出現在初始化器的括號內。)

以下是有關其工作原理的一些詳細信息。 正式語法說:

  • 表達式可以是expression , assignment-expression或者是assignment-expression
  • 賦值表達式要么是一元表達式賦值運算符賦值表達式,要么是條件表達式
  • 條件表達式邏輯或表達式? 表達式:條件表達式或是邏輯或表達式
  • 這條鏈繼續通過 C 中的所有運算符。

因此,當 C 編譯器正在尋找一個表達式時,它在理論上會經歷這些選擇中的每一個,接受逗號運算符或賦值運算符或條件運算符,等等。 當它在尋找一個賦值表達式(在聲明中)時,它從第二個選項開始,一個賦值運算符,在理論上跳過逗號作為一種可能性。

暫無
暫無

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

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