int a[3][2] = { (0), (1), (2) }; // 注意是圓括號!
int *p = a[0];
printf("%d", *p); // 輸出 1
() vs {} 的本質區別{} 初始化列表:劃分區域,每組對應一行元素。{0,1,2}初始化a[0][0]、a[0][1]、a[1][0]() 逗號運算符表達式:順序求值,取最後一個值。(0,1,2)的值是2因此{(0),(1),(2)}等價於{0,1,2},依次賦給a[0][0]、a[0][1]、a[1][0],而非三行各賦一值!
表達式1, 表達式2, ..., 表達式n // 1. 從左到右順序求值 // 2. 整個表達式的值 = 表達式n的值 // 3. 優先級最低(第15級),低於賦值運算符
#define SQUARE(x) ((x)*(x)) int z = SQUARE(5+3); // 展開:(5+3)*(5+3) = 64 正確 // 但若宏寫為 #define SQUARE(x) x*x // SQUARE(5+3) → 5+3*5+3 = 23 錯誤!
for (int i=0, j=10; i3. 返回前執行多操作
int x=1, y=1, z; z = x++, y++, ++y; printf("%d,%d,%d", x, y, z);逐步執行:
1.x++→ 值1,x變2
2.y++→ 值1,y變2
3.++y→ y變3,值3
4. 整個逗號表達式值 = 3 →z = 3
輸出:2,3,3(原文說2,3,1有誤,z賦值為整個表達式值3)總結
- 數組初始化必須用
{},()會觸發逗號運算符語義- 逗號運算符優先級最低,賦值時需加括號:
z = (x++, y++)- 宏定義參數必須加括號,防止逗號/運算符優先級問題
- 逗號運算符主要用於for循環控制多變量、返回前副作用序列,其他場合慎用
理解
()與{}的本質區別,是避免C語言初始化陷阱的關鍵。