fun(a+b, (x,y), fun(n+k, d, (a,b)));
func(rec1, rec2+rec3, (rec4,rec5));
題目稱兩者結果均為 3,詢問逗號運算符機制。
在 C/C++ 中,逗號運算符 expr1, expr2, ..., exprN 的行為定義為:
int a = 1, b = 2, c = 3;
int result = (a + b, b++, c * 2); // 步驟:
// 1. 計算 a+b = 3,值丟棄
// 2. 計算 b++,b 變為 3,表達式值為 2(舊值),丟棄
// 3. 計算 c*2 = 6,這是最後一個,整個表達式值為 6
// result = 6, b = 3
(x,y) 的值 = y 的值。
(a,b) 的值 = b 的值。
若 y=3, b=3,則外層逗號表達式最後一個參數值為 3,故結果為 3。
for 循環多變量初始化/遞增:for (i=0, j=n; i<j; i++, j--)#define SAFE_FREE(p) do { free(p); p=NULL; } while(0)(實際用 do-while,非逗號)// 函數參數列表中的逗號:分隔參數,非運算符
func(a, b, c); // 三個參數
// 初始化列表中的逗號:分隔初始化器
int arr[] = {1, 2, 3};
// 逗號運算符需括號界定優先級
int x = (1, 2, 3); // x=3
int y = 1, 2, 3; // 錯誤:聲明三個變量 y, 2, 3
逗號運算符是一個順序求值、取最後值的運算符。理解其「丟棄前值、保留後值」的特性,能避免在複雜表達式中產生邏輯誤解。日常編碼中,除循環頭部外,盡量避免在業務邏輯中使用逗號運算符,以免降低代碼可讀性。