4

C では、配列サブスクリプション:a[b]は、ポインター演算の後の逆参照に相当するシンタックス シュガーにすぎません (ここで*(a+b)説明したように)。

基本型の配列サブスクリプションはC++でどのように解釈されますか? (オーバーロードのセマンティクスがあるクラスではありません)? より具体的には、C++ が下付き文字として期待する型は何ですか? それはptrdiff_tですか?

4

2 に答える 2

7

配列サブスクリプションは C++ でどのように解釈されますか?

C ++ E1[E2]では、_*((E1)+(E2))

C++ は、添字としてどのような型を期待していますか?

C++は、スコープのない列挙型または整数型を想定しています。両方の項目は、ドラフト C++ 標準セクション5.2.1 Subscriptingパラグラフ1でカバーされています (強調鉱山):

後置式の後に角括弧で囲まれた式が後置式です。式の 1 つは「T へのポインター」型を持ち、もう 1 つはスコープのない列挙型または整数型を持つ必要があります。結果は「T」型の左辺値です。型「T」は、完全に定義されたオブジェクト型でなければなりません。62式 E1[E2] は(定義により) *((E1)+(E2)) と同じです[ 注: * と + の詳細については 5.3 と 5.7 を、配列の詳細については 8.3.4 を参照してください。—終わりのメモ]

James が指摘しているように、One of the expressions should haveという文言では、ポインター添え字を入れ替えることができます。たとえば、次のようになります。

#include <iostream>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5 } ;

    std::cout << arr[2] << ":" << 2[arr] << std::endl ;
}

代替構文を使用すること2[arr]はお勧めしません。ほとんどの人はこれが何をしているのかわからないため、コードが読みにくくなり、保守しにくくなります。

これは、ドラフトC99標準 6.5.2.1 配列添字パラグラフ2の関連セクションに似ています(強調鉱山):

角括弧 [] 内の式が後に続く後置式は、配列オブジェクトの要素の添え字指定です。添字演算子 [] の定義は、 E1[E2] が (*((E1)+(E2))) と同一であるということです。2 項 + 演算子に適用される変換規則により、E1 が配列オブジェクト (配列オブジェクトの最初の要素へのポインターと同等)であり、E2 が整数の場合、E1[E2] は E2 番目の要素を指定します。 E1 (ゼロから数えます)。

于 2013-12-04T14:54:57.660 に答える
3

この点では、C++ は C とまったく同じです。C++11 §5.2.1:

E1[E2]は (定義上) と同じです。*((E1)+(E2))

于 2013-12-04T14:53:24.300 に答える