将字符附加到字符串,有什么区别?

时间:2016-02-02 14:49:06

标签: c++ c++11

auto str = std::string();

auto a = 'a';
auto b = 'b';

//this gives the desired output
str = str + a + b;

//this gives some garbage value
str += a + b;

这两个表达式在语义上有什么区别?

第二个评估也不是:str = str + a + b;

4 个答案:

答案 0 :(得分:3)

由于+的优先级高于+ =,因此首先添加两个字符。您的代码相当于:

str += (a + b);

这显然不是你想要的。添加两个char值会产生完全不同的char值,而不是它们的串联(字符不是字符串)。

答案 1 :(得分:3)

//this gives some garbage value
str += a + b;

这在语义上与

相同
str = str + (a + b);

因为所有赋值运算符的优先级都低于几乎任何值(C ++运算符优先级表here)。

并且添加两个char一起执行字符代码的整数加法,产生更高的字符代码,这可能高于ASCII范围,因此看起来像垃圾或图形符号。在ASCII字符编码上(基本上所有PC都使用它的扩展名),'a' + 'b' == 97 + 98 == 195,例如在Latin1字符集中为'Ã'

答案 2 :(得分:2)

在第一种情况下,您有(str + a) + b。如果将其更改为str = str + (a + b),您将获得相同的垃圾结果。使用ASCII代码195(97 + 98)将a + b个字符结果转换为char,并将其添加到str

答案 3 :(得分:1)

str = str + a + b;将被评估为(str + a) + b。将使用+std::string类型的重载char运算符。这将连接 astrb将同样遵循。

如果您平台上的char类型为signed,则其他表达式未定义。这是因为首先评估a + b,这可能会使您平台上的char类型溢出。如果charunsigned,则ASCII值195将连接到str