5

誰かが次のコードの出力を説明できますか

char* a[] = {"ABC123", "DEF456", "GHI789"};
char **p = a;
cout<<++*p<<std::endl;
cout<<*p++<<std::endl;
cout<<++*p<<std::endl;

出力:

BC123
BC123
EF456

私を混乱させるのは、++*pと*p++の動作が異なることです。私は出力が次のようになることを期待していました:

ABC123
DEF456
GHI789
4

5 に答える 5

5

おそらくこれは役立つでしょう。あなたの例はこれとほぼ同等です:

++(*p);
cout << *p << '\n';

cout << *p << '\n';
++p;

++(*p);
cout << *p << '\n';

括弧なしでは、接尾辞の増分が間接参照演算子よりも優先されるため、*p++解析されます。*(p++)ただし、式全体の後でインクリメントは実行されます。

一方、プレフィックスのインクリメントと*は同じ優先順位を持っているため、++*p右から左に解析され++(*p)ます。式の前にプレフィックスの増分を実行する必要があることを知っているので、全体像をまとめることができます。

于 2012-02-20T10:46:59.823 に答える
3
char* a[] = {"ABC123", "DEF456", "GHI789"};
char **p = a;
cout<<++*p<<std::endl; // 1
cout<<*p++<<std::endl; // 2
cout<<++*p<<std::endl; // 3

1行目では、最初*pに配列内の要素を指し、 1つ前方"ABC123"++移動するため、「BC123」が出力されます。

2行目*pはまだポイントしてBC123いるので、これが印刷され、印刷される++と実行されます。これにより、ポインタが配列の2番目の要素に移動します

3行目は1行目と同じです。p(配列の2番目の要素)の内容を取得し、その文字列内の1文字を移動して、印刷します。EF456

(文字列型配列のポインター演算もここで見てください。C++はこれをどのように処理しますか?何が起こっているのかを理解するのに役立つと思います)

期待どおりに印刷するには、次のように機能します。

cout<<*p++<<std::endl;
cout<<*p++<<std::endl;
cout<<*p++<<std::endl;

または

cout<<*p<<std::endl;
cout<<*(++p)<<std::endl;
cout<<*(++p)<<std::endl;

または他のさまざまな方法(他の人が言っているように優先順位を考慮に入れる)

于 2012-02-20T10:52:17.323 に答える
1

C ++演算子の優先順位表によると、ポストインクリメントの優先順位は逆参照(*)演算子よりも高く、プレインクリメント演算子と逆参照演算子の優先順位は同じです。また、プリインクリメントおよび逆参照演算子は右から左に関連付けられています。

したがって、最初の行(cout<<++*p<<std::endl;)では、*と++が右から左に評価されます(最初に逆参照、次に増分)。ここpでも最初の配列を指しています(変更されていないため)が、(* p)は最初の文字列の2番目の文字を指しています(出力はこの事実を示しています)。

ただし、2行目(cout<<*p++<<std::endl;)では、post-incrementが最初に評価され(の古い値を取得した後p)、pがインクリメントされ、2番目の配列を指します。ただし、インクリメントする前は、pの値が式で使用され、2行目の出力は1行目とまったく同じです。

3行目では、最初にpが逆参照され(2番目の配列の最初の文字を指す)、次にインクリメントされ(2番目の配列の2番目の文字を指す)、値が出力されます。

于 2012-02-20T10:49:52.680 に答える
0

++*p印刷前に実行されます。したがって、ポインタをインクリメントしてから印刷します。 *p++印刷後に実行されます。印刷してからインクリメントします。

于 2012-02-20T10:24:03.573 に答える
0

推測ですが、を使用して差分ポインタをインクリメントしているため、cout<<++*p<<std::endl;実際に行っているのは、pが指す文字列の先頭の文字をインクリメントしてから、これを標準出力に出力することです。

同様にcout<<*p++<<std::endl;、出力後に文字をインクリメントするので、最終的cout<<++*p<<std::endl;には2つのインクリメントになります。

代わりにこれを試して、機能するかどうかを確認する必要があります

cout<<*(++p)<<std::endl; 
cout<<*(p++)<<std::endl; 
cout<<*(++p)<<std::endl; 
于 2012-02-20T10:24:04.273 に答える