4

重複の可能性:
C配列では、なぜこれが当てはまるのですか?a [5] == 5 [a]

この質問は理由を尋ねます

a[5] == 5[a]

それは1つを除いてすべての面で答えられます...

そもそも整数の後に配列の添え字を付けることができるのはなぜですか?そして、なぜ人は次のようなものを書くことを許可されていないのですか?

[a]5

また

[5]a

または[]他の奇妙な場所に置きますか?

言い換えれば、配列インデックス演算子が許可される場所の定義は何ですか?

編集I: 標準を引用するという私が受け取った答えは、最初は少し理解しづらいものでした。しかし、レスポンダーの助けを借りて、私は今理解しています。配列の添え字(角括弧)は、ポインターまたは整数の後に使用できます。ポインタの後に続く場合、括弧内は整数でなければなりません。整数の後に続く場合、括弧内はポインターでなければなりません。

彼は私に標準からの引用を理解させるためにもう少し手を握ってくれたので、私はあまり賛成されていない答えを受け入れています。しかし、標準を厳密に引用している答えも正しいです。最初は理解するのが難しかったです。

編集II: 私の質問は重複していたとは思いません。私の質問は、配列添え字演算子に関して許可されている文法についてでした。それは、私がおそらく複製した質問には決して現れない標準からの引用によって答えられました。似ていますが、重複していません。

4

3 に答える 3

6

ここで、C標準の配列添え字演算子セクションで定義されています。

(C99、6.5.2.1p2)「後置式の後に角括弧[]で囲まれた式は、配列オブジェクトの要素の添え字付き指定です。添え字演算子[]の定義は、E1[E2]がと同じであるということです。 (*((E1)+(E2)))。 "

E1およびの許可されたタイプに関してE2

(C99、6.5.2.1p1)「式の1つは「オブジェクト型へのポインタ」型であり、もう1つの式は整数型であり、結果は「型」型である必要があります。」

于 2012-10-22T19:16:34.550 に答える
6

C11標準の接尾辞式の文法:

postfix-expression:
    primary-expression
    postfix-expression [ expression ]
    postfix-expression ( argument-expression-listopt )
    postfix-expression . identifier
    postfix-expression -> identifier
    postfix-expression ++
    postfix-expression --
    ( type-name ) { initializer-list }
    ( type-name ) { initializer-list , }

C11標準の1次式文法:

primary-expression:
    identifier
    constant
    string-literal
    ( expression )
    generic-selection

等々。5は整数定数であるため、5[a]は次のように一致します。

postfix-expression [ expression ]

これがあなたの言いたいことだといいのですが。

編集:私はこれについて言及するのを忘れましたが、他のコメントはすでにしました:

式の1つは「オブジェクト型を完成させるためのポインタ」型であり、もう1つの式は整数型であり、結果は「型」型である必要があります。

その「整数型」は、意味のない浮動小数点定数の添え字を禁止するために必要です。

于 2012-10-22T19:28:06.007 に答える
1

a[5]に変換され*(a+5)ます。加算は可換であるためa+5 = 5+a、に変換して戻すことができます5[a]。私はそれがかなり役に立たない機能であることに同意します、しかし地獄、なぜそうではありませんか?

于 2012-10-22T19:16:48.720 に答える