字符串类赋值运算符(+ =)表现得很奇怪

时间:2013-01-19 01:46:20

标签: c++

我的代码很奇怪:

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;

}

上述两个陈述不应该相同吗?

4 个答案:

答案 0 :(得分:3)

没有。你的第一个例子不等于

a = a + b[0] + '!'

而是

a = a + ( b[0] + '!' )

您知道char是一个数值。由于b[0]'!'都是字符,b[0] + '!'不会为您提供连接,而是添加(b[0] + 33,基本上)。然后,您将尝试将代码b[0] + 33的ASCII字符附加到字符串中。由于b[0]'T'(ASCII 84),因此最终会得到ASCII代码117的字符:'u'

您必须将'!'替换为std::string("!")才能修复代码并进行连接。

答案 1 :(得分:2)

不,char + char = char;

std::string + char = std::string;

在你的第二个例子中。

a = a + b[0] + '!';

将是

string = ((string + char) + char)

您总是向std::string对象添加内容

答案 2 :(得分:1)

a += b[0] + '!';  

首先评估b[0] + '!'部分。由于b[0]是一个字母和'!'是一个char(原始类型),+运算符以算术方式添加它们以生成另一个char,然后使用+=运算符将其附加到字符串。

答案 3 :(得分:0)

b [0]只是一个字符。所以b [0] +'1'是char + char,这不好。内置类型不像字符串那样有任何花哨的东西,它们只是添加值。 ;)在第二个(工作)示例中,b [0]被添加到a然后'!'被添加到那里,所以总是使用字符串运算符。