0

だから私は最近、C++、C#、および Java を行ったり来たりして、いくつかの C++ コードをうまく書いています。

string LongString = "Long String";

char firstChar = LongString.at(0);

そして、このような方法を使用してみました。

void MethodA(string str)
{    
//some code    
cout << str;    
//some more code }

これが私がそれを実装した方法です。

MethodA("1. "+ firstChar );

C# と Java では完全に有効ですが、これは C++ では奇妙なことをしました。

私は次のようなものを期待していました

//1. L

しかし、プログラムの後半で、他の文字列リテラルの一部が得られました。

私は実際に何をしましたか?

期待どおりに出力されるように間違いを修正したことに注意する必要がありますが、間違ったことに本当に興味があります。

事前に感謝します。

4

5 に答える 5

3
MethodA(std::string("1. ")+ firstChar );

"1." は const char[4] であり、concat メソッドがないため)

于 2012-07-26T17:59:52.890 に答える
3

C++ は、文字列リテラルの加算を連結として定義しません。代わりに、文字列リテラルはその最初の要素へのポインターに崩壊します。1 文字は数値として解釈されるため、結果はプログラムの読み取り専用メモリ セグメント内のある場所から別の場所へのポインタ オフセットになります。

連結として追加するには、次を使用しますstd::string

MethodA(std::string() + "1. " + firstChar);
于 2012-07-26T18:00:29.237 に答える
2
MethodA("1. "+ firstChar );  //your code

あなたがしたいことをしません。これはポインタ演算です: 整数値 ( firstChar) を string-literal のアドレスに追加するだけ"1. "で、結果 (char const*型) が関数に渡され、そこで型に変換されstringます。の値に基づいて、firstChar未定義の動作を引き起こす可能性がありました。実際、あなたの場合、結果のポインターが文字列リテラルを超えて指しているため、未定義の動作が呼び出されます。

これを書きます:

MethodA(string("1. ")+ firstChar ); //my code
于 2012-07-26T17:59:44.243 に答える
2

問題は"1. "、ポインターに崩壊する文字列リテラル (文字の配列) であることです。文字自体はcharにプロモートできる であり、と のint追加は、元のポインターをその多くの位置だけオフセットすることによって新しいポインターを計算することとして定義されます。const char*int

C++ のコードは、 (文字の ASCII 値) を文字列リテラルMethodAに追加した結果を呼び出しています。値が4 より大きい場合 (おそらくそうです)、未定義の動作になります。(int)firstChar"1. "firstChar

于 2012-07-26T18:01:31.617 に答える