[英]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
。
沒有括號,編譯器需要您要在此處定義的下一個變量的名稱。 2
和3
不是定義變量的有效標識符,因此編譯器會抱怨。
x = 1, 2, 3;
由於優先級,這被解釋為(x = 1), 2, 3;
.
int x = 1, 2, 3;
在表達式語句中,例如x = 1, 2, 3;
, 你可以使用任何表達式。 但是,在聲明中,初始化程序只能是賦值表達式(或{
和}
內的初始化程序列表)。
正式的 C 語法的編寫方式,表達式的頂級運算符可以是 C 運算符中的任何一個,但賦值表達式的頂級運算符可以是除 Z0D61F8370CAD4D4D412F80B84D ,
的任何一個運算符。 因此,如果在解析初始化器的頂層時看到 a ,
則它不能是初始化器的一部分,因此它會結束初始化器。 (A ,
可以出現在初始化器的括號內。)
以下是有關其工作原理的一些詳細信息。 正式語法說:
,
assignment-expression或者是assignment-expression 。?
表達式:
條件表達式或是邏輯或表達式。因此,當 C 編譯器正在尋找一個表達式時,它在理論上會經歷這些選擇中的每一個,接受逗號運算符或賦值運算符或條件運算符,等等。 當它在尋找一個賦值表達式(在聲明中)時,它從第二個選項開始,一個賦值運算符,在理論上跳過逗號作為一種可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.