在 C/C++ 編程中,存在一個看似反直覺但完全合法的語法現象:數組下標訪問表達式 a[i] 與 i[a] 完全等價。例如:
int a[5] = {1, 2, 3, 4, 5};
// a[3] 的值是 4
// 3[a] 的值也是 4
這究竟是語言規定的特例,還是有深層原理支撐?
根據 C/C++ 標準,下標運算符 [] 的定義是:
E1[E2] 完全等價於 *(E1 + E2)
這意味著,只要參與運算的兩個表達式中有一個是指針類型,另一個是整數類型,順序不影響結果。因為指針加法滿足交換律:
a + i == i + a
*(a + i) == *(i + a)
數組名 a 在表達式中會隱式轉換為指向首元素的指針,i 是整數索引,因此 a[i] 即 *(a+i),而 i[a] 即 *(i+a),兩者指向同一內存地址。
這一設計源於 C 語言早期的簡化考量:
E1[E2] 翻譯為 *(E1+E2),無需額外語法規則處理順序。3[a],但實際開發中強烈建議遵循 數組[索引] 的慣例,提高代碼可讀性。C99 標準(ISO/IEC 9899:1999)第 6.5.2.1 節「Array subscripting」明確規定:
A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
約束條件僅要求「其中一個表達式為指向對象類型的指針,另一個為整數類型」,未限制順序。
雖然 i[a] 合法,但請務必遵循 a[i] 寫法。這是行業通用規範,能:
理解底層原理是為了寫出更好的代碼,而非利用冷門特性炫技。