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;
?
答案 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
运算符。这将连接 a
到str
。 b
将同样遵循。
如果您平台上的char
类型为signed
,则其他表达式未定义。这是因为首先评估a + b
,这可能会使您平台上的char
类型溢出。如果char
为unsigned
,则ASCII值195将连接到str
。