ホームページ >バックエンド開発 >C++ >2[arr] = 5 は C および C でアサーションをコンパイルして渡しますか?

2[arr] = 5 は C および C でアサーションをコンパイルして渡しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 07:17:10247ブラウズ

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

C および C の Index[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)、[] 演算子は次の形式の引数を期待します。

  • オブジェクトへのポインター型の 1 つの式
  • 整数型の 1 つの式
  • 結果の式オブジェクトと同じタイプの

さらに、同じセクションの段落 2 で次のように説明されています。 E1[E2] は (*((E1) (E2))) と同等です。これは、式 E1[E2] がポインター操作として解釈できることを示します。

  • E1 は、配列の最初の要素へのポインターに変換されます。
  • E2 は、に追加されます。ポインタ。その結果、配列の E2 番目の要素を指す新しいポインタが生成されます。
  • 結果のポインタを逆参照すると、選択された配列要素の値。

重要なことに、[] の引数の順序が正しいという要件は標準内にありません。したがって、式 2[arr] は (*((2) (arr))) と同等として扱われます。整数である

  • 2 が、次の最初の要素を指すポインターに追加されます。 arr.
  • 結果のポインタは、arr.
  • 結果のポインタの 3 番目の要素を指します。 (つまり、arr[2] にアクセスすると) 値 5 が 3 番目の要素に割り当てられます。

したがって、割り当てと後続のアサーションは両方とも期待どおりに成功します。

以上が2[arr] = 5 は C および C でアサーションをコンパイルして渡しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。