我的这段代码表现得很奇怪:
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;
}
以上两种说法不应该是一样的吗?
我的这段代码表现得很奇怪:
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;
}
以上两种说法不应该是一样的吗?
不,你的第一个例子不等于
a = a + b[0] + '!'
而是为了
a = a + ( b[0] + '!' )
你知道 char 是一个数值。因为b[0]
和'!'
都是字符,所以b[0] + '!'
不会给你一个连接,而是一个加法(b[0] + 33
基本上)。然后您将尝试将代码的 ASCII 字符附加b[0] + 33
到您的字符串中。由于b[0]
is 'T'
(ASCII 84),你最终得到 ASCII 码 117 : 的字符'u'
。
您将不得不替换'!'
bystd::string("!")
以修复代码并进行连接。
不,char + char = char;
std::string + char = std::string;
在你的第二个例子中。
a = a + b[0] + '!';
将会
string = ((string + char) + char)
你总是在向std::string
对象添加一些东西
在
a += b[0] + '!';
首先评估该b[0] + '!'
部分。就像b[0]
一个字符和'!' 是一个 char (原始类型),+
运算符以算术方式将它们相加以产生另一个 char,然后使用运算符将其附加到字符串中+=
。
b[0] 只是一个字符。所以 b[0] + '1' 是 char + char,这不好。内置类型不像字符串那样有任何花哨的东西,它们只是添加值。;) 在第二个(工作)示例中,b[0] 被添加到 a 然后 '!' 被添加到其中,所以总是使用字符串运算符。