您的代碼:
a=3;
b=5;
c=a,b;
d=(a,b);
,如果它是書面的處理:
a=3;
b=5;
(c=a),b;
d=(a,b);
這就是爲什麼c == 3
和d == 5
。
一個好的編譯器可能會警告你包含賦值爲c
;對b
的評估對計算的狀態沒有影響。類似地,在d
的表達式中評估a
。
什麼d=(a,b)
—它是如何顯示在輸出d=5
?
逗號操作符是C.它所有運營商的優先級最低也必須記住,在函數的參數列表中的逗號不逗號運營商。
通過舉例說明的逗號操作的行爲:
x, y;
是評估表達x
和丟棄的結果,然後計算表達式y
(和總的結果是的y
的值)。逗號運算符有一個序列點;這是一種對你現在無關緊要的改進,但未來可能會有所改進。
在您的表達:
d = (a, b);
表達a
進行評估(它是3)和忽略;那麼對錶達式b
進行評估(它是5),並將其用作逗號運算符表達式的結果,因此將其用作括號表達式的結果,因此將值5指定爲d
。
相反,在表達式:
c = a, b;
逗號運算的LHS是c = a
,所以a
進行評估(它是3)和分配給c
。然後扔掉,並且b
被評估。因此,整體表達式語句僅將c賦予3。
您可能會問:「爲什麼逗號運算符有用?」
在有些情況下它是有用的地方,如for
循環的初始化和增量部分:
for (i = 0, s = p; *s != '\0'; i++, s++)
{
...
}
有兩個逗號運營商那裏。第一個包含一對分配;第二個包含一對帶有副作用的表達式。
另一個地方,它有時被用來(雖然我認爲這是很少良好的作風),是:
if (some_variable == A_VALUE)
p = q++, r = z;
這種「節約」不必增加周圍的狀況的身體支撐。然而,隱藏這樣的作業並不是一種好的風格。該代碼應該是(給予或採取括號的位置,這是有爭議的):
if (some_variable == A_VALUE)
{
p = q++;
r = z;
}
如果你喜歡混淆後的C,還有的International Obfuscated C Code Contest。
如果您正在編寫宏,有時候逗號運算符可能會成爲生命保護程序。
d =(a,b) 它如何在輸出中顯示d = 5? – 2012-03-24 20:54:11