4

次のコードで私は混乱し、<<であるはずの場所に+を追加しました

#include <iostream>
#include "Ship.h"

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    char someLetter = aLetter(true);
    cout <<"Still good"<<endl;
    cout << "someLetter: " + someLetter << endl;
    return 0;
}

する必要があります

cout << "someLetter: " << someLetter << endl;

誤ったコードが出力されました:

こんにちは世界!
まだ良い
os::clear

私が理解していないのは、コンパイラがエラーをキャッチしなかった理由と、os :: clearの意味は何ですか?また、なぜ行の先頭に「someLetter:」がなかったのですか?

4

5 に答える 5

8

ここに"someLetter: "、文字列リテラル、つまりconst char *ポインタがあります。これは通常、すべての文字列リテラルが格納されている読み取り専用のメモリ領域を指します。

someLetterはであるcharため"someLetter: " + someLetter、ポインタ演算を実行someLetterし、ポインタに格納されているアドレスにの値を追加します。最終結果は、印刷しようとした文字列リテラルの先を指すポインターです。

あなたの場合、ポインタはシンボルテーブルにあり、ios::clearメソッド名の2番目の文字を指しているようです。someLetterただし、これは完全に任意ですが、文字列リテラルの格納領域の値と内容によっては、ポインタが別の(おそらくアクセスできない)場所を指すようになる可能性があります。要約すると、この動作は未定義であり、信頼することはできません。

于 2012-05-18T08:05:45.397 に答える
3

+演算子は。とは何の関係もありませんcout

この表に示されているように、はより+も優先順位が高い<<ため、問題のあるコード行は次のように解析されます。

(cout << ("someLetter: " + someLetter)) << endl;

つまり、+charポインタとcharに適用されます。charは整数データ型であるため、実際にはポインター演算を実行し、右側のcharの整数値を左側のポインターに追加して、新しいcharポインターを生成します。

于 2012-05-18T08:13:30.163 に答える
2

+はでポインタを算術的に実行しています"someLetter: "

于 2012-05-18T08:08:11.220 に答える
2

"someLetter: "C文字列はをchar someLetterインデックスとして使用しているため、メモリの一部を指していると思います。したがって、動作。

C ++では、ばかげたことをすると奇妙な振る舞いをします。言語はあなたにあなた自身をぶら下げるためのたくさんのロープを与えます。

于 2012-05-18T08:05:36.297 に答える
0

リテラル文字列は、メモリ領域への単なるポインタであることを覚えておく必要があります。"someLetter: " + someLetterそのポインタに値を追加して、それを出力しようとしています。

于 2012-05-18T08:06:16.323 に答える