在C 和C 語言中透過索引[Array] 存取陣列:交換好奇心
困擾面試官的神秘問題:
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
直覺顯示a[b] 被翻譯為*(a b)並且,由於加法是可交換的,2[arr] 應等於 *(2 arr)。
標準支持這一點嗎?
確實,C 和 C 標準認可這種行為。
C 標準(C99):
第6.5.2.1 節,第1 段:
其中一個表達式應具有「指向物件類型的指標」類型,另一個表達式應具有整數類型,且結果的類型為「type」。
第 2 段(強調添加):
後綴表達式後跟方括號 [] 中的表達式是數組物件元素的下標指定。 下標運算子[]的定義是E1[E2]等同於(*((E1) (E2)))。由於適用於二元運算子的轉換規則,如果E1 是陣列物件(相當於指向陣列物件的初始元素的指標)且E2 是整數,則E1[E2] 指定E1 的第E2 個元素(從零開始計數)。
結論
標準明確指出:無論參數的順序為何,E1[E2] 等價於 *(E1 E2)。因此,2[arr] 產生與 arr[2] 相同的結果,允許賦值和斷言都成功,而不會引起驚訝。
以上是C 和 C 中的「2[arr]」等於「arr[2]」:交換陣列存取嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!