2006-11-23

Array Subscripting in C

在 C 語言中,我們這樣宣告一個陣列:

char c[] = "abcdefgh";

一般,我們會用 c[0], c[1], ... 這樣的語法來存取陣列。在這個例子中,我們知道 c[0]'a',而 a[1]'b',如果是寫成 3[c] 呢?一般人大概會猜 'd',沒錯!跟 c[3] 的值一樣,就是 'd'。那如果宣告成 int 陣列呢?會不會有什麼不一樣的結果呢?

int i[] = {1, 2, 3, 4, 5, 6, 7, 8};

2[i] 的值應該是多少?沒錯,答案還是跟 i[2] 一樣,就是 3

類似 3[c] 這般的寫法看起來很奇怪,令人全身不舒服,但是在 C/C++ 語言中卻是合法的。我們可以大膽假設:

對於一維陣列來說,如果 x[y] 符合語法,則 x[y] 就等於 y[x]

在 C 語言中,指標 (pointer) 與陣列 (array) 之間有著很密切的關係,一般人也常不明就裡地混用。根據 C 語言的規定,x[y]*((x) + (y)) 是完全一樣的。換句話說,C 編譯器會把 x[y] 解讀為 *((x) + (y))。而 x[y] 要能夠通過 C 語言文法,xy 其中一個必須為指標,另一個必須能夠賦值 (evaluate) 為整數。以 binary operator + (加法) 作用在整數與指標上,最後會賦值為指標型別。因為加法具有可交換性 (commutativity),所以不管是 ((x) + (y)) 或是 ((y) + (x)) 都是作指標相加,因此這兩個述式所得到的結果是一樣的。

當然,類似 0[i] 這種寫法並不值得鼓勵,除非你是在參加 IOCCC 比賽。

參考:C FAQ: Question 6.11

No comments: