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

C 語言數組下標交換性:a[b] 等價於 b[a] 的原理解析

     編輯:程式設計綜合問答

現象代碼

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] 違反直覺,屬於「寫時只讀」代碼,嚴禁在生產代碼中使用。**

  • C 標準允許此語法,但不推薦。
  • 靜態分析工具 (如 Clang Static Analyzer、Coverity) 會報警告。
  • 代碼審查時會被要求修正為 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] 形式**,讓代碼意圖清晰明確。

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