字符串类赋值操作符(+=)行为怪异
String class assignment operator (+=) behaves weirdly
这段代码的行为很奇怪:
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,然后'!'被添加到其中,所以总是使用字符串操作符
相关文章:
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 将std::basic_string赋值给字符串
- c++中的重载赋值操作符
- c++类继承和赋值操作符
- 带引用类成员的赋值操作符
- 复制构造函数,赋值操作符重载
- c++派生类赋值操作符
- 通过调用Move赋值操作符实现Move构造函数
- 带有映射的赋值操作符
- 单参数构造函数和赋值操作符
- 如何从复制赋值操作符调用复制构造函数
- c++复制构造函数,重载赋值操作符,方法get()
- 用于具有const数据成员的类的move和右值赋值操作符
- 类赋值操作符和复制构造函数
- 赋值操作符重载
- 影响正确性的move构造函数/赋值操作符示例
- 当类是子类时重载赋值操作符
- 创建了自己的字符串类——重载赋值操作符和析构函数的错误
- 字符串类赋值操作符(+=)行为怪异
- 字符串的赋值操作符