C ++操作员订单评估

时间:2019-12-04 10:08:40

标签: c++ operators evaluation

我有代码,它给了我一个编译错误。 我期望左右操作员订单评估。 'name + =“:”'的结果是字符串,但是看起来它首先评估了“:” +“ O”。我没有找到清楚的解释。

#include <string>

int main()
{
  std::string name("HELL");
  name += ":" + "O";
  std::cout << "Hello, " << name << "!\n";
}

3 个答案:

答案 0 :(得分:6)

表达式name += ":" + "O"分组name += (":" + "O")

但这会导致编译错误,因为":""0"const char[2]类型,它们会衰减为该表达式中的const char*指针;指针不能相加!

在C ++ 14中,您可以使用用户定义的文字 +""s置于“字符串模式”:

name += ""s + ":" + "O"

分组规则被硬连接到语言语法中,尽管用operator precedence and associativity来思考很方便。

答案 1 :(得分:3)

根据operator precedenceoperator+的优先级高于operator+=,则name += ":" + "O";被解释为name += (":" + "O");,而":" + "O"无效,您不能添加两个指针(":""O"会衰减为类型为const char*的指针)。

您可以添加()来指定优先级,例如(name += ":") + "O";,它会编译,但请注意,部分+ "O"在这里变得毫无意义。或者,您可能希望按照@Scheff的建议使用(name += ":") += "O";,这取决于您的需求。

答案 2 :(得分:0)

此表达式语句具有复合赋值

name += ":" + "O";

实际上等同于

name = name + ( ":" + "O" );

在此子表达式中

( ":" + "O" )

字符串文字将转换为指向其第一个元素的指针。但是,没有为指针定义二进制运算符+。因此,编译器会发出错误消息。

您可以将原始语句分成两个语句,例如

name += ":";

name += "O";

在这种情况下,将使用为类std :: basic_string定义的运算符+,该类型接受类型为const char *的参数。