我有代码,但是它给我编译错误。 我期望从左到右进行运算符优先级的评估。'name += ":"' 的结果是字符串,但看起来它先评估了":" + "O"。我没有找到任何清晰的解释。
#include <string>
int main()
{
std::string name("HELL");
name += ":" + "O";
std::cout << "Hello, " << name << "!\n";
}
我有代码,但是它给我编译错误。 我期望从左到右进行运算符优先级的评估。'name += ":"' 的结果是字符串,但看起来它先评估了":" + "O"。我没有找到任何清晰的解释。
#include <string>
int main()
{
std::string name("HELL");
name += ":" + "O";
std::cout << "Hello, " << name << "!\n";
}
name += ":" + "O"
被分组为name += (":" + "O")
。但是,由于“:”
和“0”
是const char [2]
类型,在该表达式中会衰减为const char*
指针;而指针不能相加!从C++14开始,您可以使用用户定义的字面量 ""s
将+
置于“字符串模式”中:name += ""s + ":" + "O"
分组规则已经硬编码到语言的 语法 中,尽管按照 运算符优先级和结合性 来思考更为方便。
name += ":"s + "O";
?有什么区别吗? - Daniel Langr:0
就可以了。 - Bathshebaname += std::string("") + ":" + "O"
可能是这样的吧? - YSCjava.lang.String
进行操作符重载。 - Bathsheba+
:name += ":" "0";
。预处理器会将相邻的字符串字面量连接起来,这样就消除了临时的 std::string
对象。 - Pete Becker(name += ":") += "O";
? - Scheff's Cat+=
的链接看起来对我来说很丑陋。我不太清楚为什么,因为我很高兴地链接 std::cout << ... << ...
,但是用 +=
来做这件事感觉就错了。 :) - Frodyne()
吗?operator+=
的结合性是从右到左的,如果没有 ()
,":" += "O"
将首先被计算,但这是无效的。 - songyuanyao这个带有复合赋值的表达式语句
name += ":" + "O";
实际上等同于
name = name + ( ":" + "O" );
在这个子表达式中
( ":" + "O" )
字符串字面量被转换为它们第一个元素的指针。然而,指针并没有定义二进制运算符 +。因此编译器会发出错误。
您可以将原始语句拆分为两个语句,例如
name += ":";
并且
name += "O";
const char *
的参数。