38

一部のインタビュアーが何らかの理由で尋ねるのが好きなこの小さなトリックの質問があります:

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

私が理解できることから、a[b]変換され*(a + b)、加算は可換であるため、それらの順序は実際には重要ではありません。実際、それは問題なく2[a]機能*(2 + a)します。

これはCおよび/またはC++の仕様で動作することが保証されていますか?

4

2 に答える 2

36

はい。6.5.2.1段落1(C99標準)は、[]演算子への引数を説明しています。

式の1つは「オブジェクトへのポインタ」タイプで、もう1つのtype式は整数型で、結果は「type」タイプです。

6.5.2.1段落2(強調を追加):

後置式とそれに続く角括弧内の式[]は、配列オブジェクトの要素を下書きで示したものです。添え字演算子の定義は、[]E1[E2]同じです(*((E1)+(E2)))+二項演算子に適用される変換規則のため、E1が配列オブジェクト(同等に、配列オブジェクトの初期要素へのポインター)でE2あり、が整数である場合、(ゼロから数えて)の-番目の要素をE1[E2]指定します。E2E1

それは、議論の順序[]が正気である必要があることを何も述べていません。

于 2011-02-22T02:16:58.060 に答える
30

一般2[a]に、これはCとC ++の両方で同等であることが保証されています(演算子のオーバーロードがないと仮定)。これは、意図したとおり、それぞれまたはa[2]に変換されるためです。プラス演算子は可換であるため、2つの形式は同等です。*(2+a)*(a+2)

フォームは同等ですが、聖なるもの(および将来のメンテナンスプログラマー)のために、「a[2]」フォームを他のフォームよりも優先してください。

PS、インタビューでこれを求められた場合は、C / C ++コミュニティに代わって正確な復讐を行い、回答を与えるための前提条件として、インタビュアーにすべてのトリグラフシーケンスをリストするように依頼してくださいおそらく、これは彼/彼女が将来そのような(実際に何かをプログラミングすることに関しては価値がない)質問をすることから彼/彼女を魅了するでしょう。インタビュアーが実際に9つのトリグラフシーケンスすべてを知っているという奇妙なイベントでは、仮想基本クラスの破棄順序についての質問で、いつでも別の試みを行うことができます。この質問は、日常のプログラミングとはまったく無関係です。

于 2011-02-22T02:14:20.703 に答える