a[x++] = i; 是 C 語言中常見但易誤解的寫法。本文明確其執行語義、等價拆解及與 a[x+1] = i 的本質區別。
a[x++] = i;
// 等價於:
a[x] = i; // 1. 使用 x 當前值作為下標賦值
x++; // 2. 隨後 x 加 1
關鍵點:
x++ 的副作用(修改 x)在賦值完成後、下一序列點之前完成。i 轉換後的值),而非 x++ 的結果。| 表達式 | 下標計算 | 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
a[x++] = x++; → 未定義行為(UB),編譯器可任意處理。func(a[x++], x); 參數求值順序未規定,結果不可移植。#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」,即可避免下標邏輯錯誤。