私はこのコードが奇妙に動作しています:
int main() {
string a = "TRY";
string b = "THIS";
a += b[0] + '!'; //This outputs "TRYu"?
//a = a + b[0] + '!'; //This outputs "TRYT!" as expected.
cout << a;
}
上記の 2 つのステートメントは同じであってはなりませんか?
私はこのコードが奇妙に動作しています:
int main() {
string a = "TRY";
string b = "THIS";
a += b[0] + '!'; //This outputs "TRYu"?
//a = a + b[0] + '!'; //This outputs "TRYT!" as expected.
cout << a;
}
上記の 2 つのステートメントは同じであってはなりませんか?
いいえ、最初の例は等しくありません
a = a + b[0] + '!'
しかし、むしろ
a = a + ( b[0] + '!' )
char は数値であることはわかっています。b[0]
とは両方とも'!'
文字であるb[0] + '!'
ため、連結ではなく追加 ( b[0] + 33
、基本的に) が得られます。次に、code の ASCII 文字を文字列に追加しようとしますb[0] + 33
。b[0]
は'T'
(ASCII 84) であるため、ASCII コード 117 : の文字になります'u'
。
コードを修正して連結するには、'!'
に置き換える必要があります。std::string("!")
いいえ、char + char = char;
std::string + char = std::string;
あなたの2番目の例では。
a = a + b[0] + '!';
だろう
string = ((string + char) + char)
std::string
オブジェクトに常に何かを追加している場所
b[0] は単なる文字です。つまり、b[0] + '1' は char + char であり、それはダメです。組み込み型には、文字列のように複雑なことは何もありません。値を追加するだけです。;) 2 番目の (実際の) 例では、b[0] が a に追加され、次に '!' が追加されます。それに追加されるため、常に文字列演算子が使用されます。