int main() {
int b = 4;
int a[5] = {1, 2, 3, 4, 5};
printf("a[b] = %d\n", a[b]); // 輸出 5
printf("b[a] = %d\n", b[a]); // 輸出 5
return 0;
}
結果均為 5,看似 a[b] == b[a]。
C 語言中,數組下標操作 E1[E2] 由標準定義為 *(*(E1) + (E2)) (C99 §6.5.2.1)。即:
a[b] → *(a + b)
b[a] → *(b + a)
由於指針算術中 a + b 與 b + a 等價 (加法交換律),且解引用 * 作用於同一地址,**兩者完全等價**。
a 是數組名,在表達式中退化為指向首元素的指針 (int *)。b 是整型變量,值為 4。a + b 計算地址:首地址 + 4 * sizeof(int) → 第 5 個元素地址。b + a 計算地址:同樣結果。**雖然語法合法且等價,但 b[a] 違反直覺,屬於「寫時只讀」代碼,嚴禁在生產代碼中使用。**
a[b]。int *p = a;
printf("%d\n", p[b]); // 5
printf("%d\n", b[p]); // 5,同樣合法但極度不推薦
這體現了 C 語言「數組下標 = 指針偏移 + 解引用」的核心設計哲學:下標操作本質是指針算術。
a[b] 與 b[a] 在 C/C++ 中**語法合法、語義等價、編譯通過、運行結果相同**,但後者**極大降低可讀性**,屬於濫用語言特性。**永遠使用 array[index] 形式**,讓代碼意圖清晰明確。