首頁 > 後端開發 > C++ > 2[arr] = 5 是否在 C 和 C 中編譯並通過斷言?

2[arr] = 5 是否在 C 和 C 中編譯並通過斷言?

Mary-Kate Olsen
發布: 2024-12-03 07:17:10
原創
254 人瀏覽過

Does 2[arr] = 5 Compile and Pass Assertion in C and C  ?

在C 和C 語言中透過索引[array]存取陣列

在面試官有時提出的知識測驗中,出現以下程式碼:

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
登入後複製

表達式2[arr]最初可能會編譯失敗,因為它似乎正在嘗試使用整數作為數組名稱來索引數組。然而,這種意想不到的語法在 C 和 C 中確實有效。

要理解原因,讓我們深入研究這些語言中 [] 運算子的技術細節。

C 和 C數組訪問語義

根據 C99 標準(6.5.2.1 第 1 段), []運算子需要以下形式的參數:

  • 一個指針對象類型的表達式
  • 一個整數類型的表達式
  • 相同類型的結果表達式作為物件

此外,同一節的第2段解釋了E1[E2]相當於(*((E1)(E2)))。這表示表達式 E1[E2] 可以解釋為指標運算:

  • E1 轉換為指向陣列初始元素的指標。
  • E2 被加到指針,產生一個指向數組的第 E2 個元素的新指針。
  • 取消引用結果指標將傳回所選數組的值

至關重要的是,標準中沒有要求 [] 的參數順序保持合理。因此,表達式 2[arr] 被視為等價於 (*((2) (arr)))。

  • 2(一個整數)被加到指向第一個元素的指標arr.
  • 結果指標指向arr.
  • 取消引用結果指標(即訪問arr[2]) 將值5 賦給第三個元素。

因此,賦值和後續斷言都成功,如預期。

以上是2[arr] = 5 是否在 C 和 C 中編譯並通過斷言?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板