0

時々、C++ で異なる配列アクセス スタイルを目にし、それがアセンブリ アドレッシング モードに関連している可能性があると考えました。

C++:

int * aa=new int[2];
0[aa]=15; //a little different than aa[0]
1[aa]=15;
aa[0]=15;
aa[1]=15;
printf("%d %d \n",aa[0],aa[1]);

組み立て:

__asm
{
    mov aa[0],ebx
    mov aa[1],eax
    mov 0[aa],ebx
    mov 1[aa],eax
}

この C++ 配列アクセス表記法は標準ですか? はいの場合、アセンブリ アドレッシング モードから派生したものですか?

私が試してみると[aa]1=5;、コンパイラは

  • "aa 属性が見つかりません",
  • "ない ';' 「定数」の前」
  • 「左オペランドは左辺値でなければなりません」。

    //ポインタ演算をしようとすると、

    *(aa+1)=0//エラーなし

    *(aa+0)=0//エラーなし:)

このルールは、演算子 [] のオーバーロードと同じですか?

MSVC++ 2010

ありがとうございました。

4

3 に答える 3

5

これは、C および C++ のよく知られた癖であり、式のどちらの半分が角括弧に入るかはあまり気にしません[]。どちらも同じ同等の式に評価されます。

*(0+aa)=15;
于 2012-09-10T16:11:04.733 に答える
4

a[b]は基本的に に変換され*(a+b)ます。だからこそ、この「スタイル」11[arr]が可能です。

失敗の理由[aa]11は純粋に構文上のものです。

于 2012-09-10T16:11:57.947 に答える
3

この C++ 配列アクセス表記は標準ですか?

はい。オペランドの 1 つがポインタで、もう 1 つが算術演算である限り、a[b]は と同等*(a+b)であるため、ポインタまたはインデックスが 内にあるかどうかは問題ではありません[]

はいの場合、それはアセンブリ アドレッシング モードから派生したものですか?

ほぼ確実にそうではありません。構文は、元々 PDP ファミリーのコンピューター用に開発された C から直接来ており、そのアセンブリ アドレス指定モードが書かれて1(aa)います。

試してみると[aa]1=5、コンパイラが (エラー) を返します

これは、添字式の構文が として指定されているためです。postfix-expression [ expression ]そのため、オペランド in[]は他のオペランドの後に来る必要があります。

このルールは、演算子 [] のオーバーロードと同じですか?

いいえ。演算子がオーバーロードされている場合、 thena[b]は と同等でa.operator[](b)あり、 ではありませんb.operator[](a)

于 2012-09-10T16:29:13.133 に答える