首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言逗號運算符與數組初始化陷阱深度解析

     編輯:關於C語言

C語言逗號運算符與數組初始化陷阱深度解析

現象:為什麼輸出是1而不是0?

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級),低於賦值運算符

經典陷阱案例

1. 宏參數副作用

#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 錯誤!

2. for循環多變量控制

for (int i=0, j=10; i

3. 返回前執行多操作

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)

總結

  1. 數組初始化必須用{},()會觸發逗號運算符語義
  2. 逗號運算符優先級最低,賦值時需加括號:z = (x++, y++)
  3. 宏定義參數必須加括號,防止逗號/運算符優先級問題
  4. 逗號運算符主要用於for循環控制多變量、返回前副作用序列,其他場合慎用

理解()與{}的本質區別,是避免C語言初始化陷阱的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved