首頁  >  文章  >  後端開發  >  C 和 C 中的「2[arr]」等於「arr[2]」:交換陣列存取嗎?

C 和 C 中的「2[arr]」等於「arr[2]」:交換陣列存取嗎?

Susan Sarandon
Susan Sarandon原創
2024-11-25 14:42:11787瀏覽

Does `2[arr]` Equal `arr[2]` in C and C  : A Commutative Array Access?

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn