配列のインデックス付けの一般的な形式は array[index] ですが、C および C では代替構文が提供されています。インデックス[配列]。この構文は多くのプログラマーを困惑させてきましたが、言語仕様では有効ですか?
int arr[] = {1, 2, 3}; 2[arr] = 5; // Does this compile? assert(arr[2] == 5); // Does this assertion fail?
このひっかけ質問は、次の可換的な性質に依存しています。追加。演算 Index[array] は *(index array) に変換され、加算は可換であるため、2[arr] と arr[2] は同等であると想定できます。ただし、これは言語仕様に明示的に記載されていません。
はい、コードは C および C 仕様に従って有効です。
C99 (6.5.2.1、段落1):
One of the expressions shall have type "pointer to object type", the other expression shall have integer type, and the result has type "type".
C99 (6.5.2.1、段落 2):
A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).
これらの仕様では引数の順序は必要ありません正気になるために[]に。したがって、コード内の両方の行が期待どおりにコンパイルおよび実行され、アサーションが成功します。
以上が`index[array]` は C および C の有効な配列アクセス構文ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。