C および C のインデックス [配列] による配列へのアクセス : 可換的好奇心
面接官を困惑させる謎めいた質問:
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
直感的には、a[b] は翻訳されると思われます
標準はこれを裏付けていますか?
実際、C および C 標準はこの動作を承認しています。
C 標準(C99):
セクション 6.5.2.1、段落 1:
式の 1 つは「オブジェクト型へのポインター」型を持ち、もう 1 つの式は整数型を持つものとします。結果の型は "type" です。
段落 2 (強調)追加):
角括弧 [] で囲まれた式が後に続く後置式は、配列オブジェクトの要素の添字付きの指定です。 添字演算子 [] の定義は、E1[E2] が (*((E1) (E2))) と同一であることです。二項演算子に適用される変換規則により、E1 が配列オブジェクト (配列オブジェクトの最初の要素へのポインタと同等) で、E2 が整数の場合、E1[E2] は E1 の E2 番目の要素を指定します。 (ゼロから数えます)。
結論
この規格では明確に次のように述べられています。 E1[E2] は、引数の順序に関係なく、*(E1 E2) と同等です。したがって、2[arr] は arr[2] と同じ結果を返し、代入とアサーションの両方が眉をひそめることなく成功します。
以上が`2[arr]` は C および C : 可換配列アクセスの `arr[2]` と等しくなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。