首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言後置遞增在數組下標中的行為:`a[x++] = i` 等價拆解

     編輯:程式設計疑難解答

a[x++] = i; 是 C 語言中常見但易誤解的寫法。本文明確其執行語義、等價拆解及與 a[x+1] = i 的本質區別。

標準語義 (C99/C11)

a[x++] = i;
// 等價於:
a[x] = i;  // 1. 使用 x 當前值作為下標賦值
x++;       // 2. 隨後 x 加 1

關鍵點:

  • 副作用:x++ 的副作用(修改 x)在賦值完成後、下一序列點之前完成。
  • 值:整個表達式的值是賦值結果(即 i 轉換後的值),而非 x++ 的結果。

對比:`a[x+1] = i`

表達式下標計算x 是否改變典型用途
a[x++] = i用 舊 x是,x+1順序填充數組,自動推進下標
a[x+1] = i用 x+1否寫入「下一個」位置,保持 x 不變

圖解執行過程

初始: x = 2, a[0..4] = {0}, i = 99

a[x++] = i;
// 步驟1: 下標 = 2 → a[2] = 99
// 步驟2: x = 3
// 結果: a = {0,0,99,0,0}, x = 3

a[x+1] = i;
// 步驟1: 下標 = 3 → a[3] = 99
// 步驟2: x 不變
// 結果: a = {0,0,0,99,0}, x = 2

常見陷阱

  1. 同一表達式多次修改 x:a[x++] = x++; → 未定義行為(UB),編譯器可任意處理。
  2. 函數參數求值順序:func(a[x++], x); 參數求值順序未規定,結果不可移植。
  3. 宏展開風險:#define INC(x) ((x)++) 配合數組下標易出錯,優先用內聯函數。

最佳實踐

  • 代碼審查時,將 a[x++] = i 展開為兩行,可讀性更強:
a[x] = i;
x++;
  • 需要「寫入並推進」時,封裝為函數:void append(int *arr, int *idx, int val) { arr[(*idx)++] = val; }

牢記 a[x++] = i =「先用後增」,區別於 a[++x] = i =「先增後用」與 a[x+1] = i =「不修改 x」,即可避免下標邏輯錯誤。

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