字符串类赋值操作符(+=)行为怪异

String class assignment operator (+=) behaves weirdly

本文关键字:赋值操作符 字符串      更新时间:2023-10-16

这段代码的行为很奇怪:

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;
}

以上两个语句不应该是相同的吗?

No。第一个例子不等于

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("!")来修复代码并进行连接。

No, char + char = char;

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

在第二个例子中

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

string = ((string + char) + char)

你总是添加一些东西到std::string对象

In

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

首先计算b[0] + '!'部分。因为b[0]是一个字符和'!'是一个char(基本类型),+运算符将它们算术相加产生另一个char,然后用+=运算符将其附加到字符串上。

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