C++ 运算符顺序评估
C++ operator order evaluation
我有代码,但出现编译错误。
我期待左右运算符顺序评估。 '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 开始,您可以使用 user-defined-literal ""s
:[= 将 +
放入 "string mode" 20=]
name += ""s + ":" + "O"
分组规则是固定在语言 语法 中的,尽管用 operator precedence and associativity.
来思考很方便
根据operator precedence,operator+
的优先级高于operator+=
,那么name += ":" + "O";
被解释为name += (":" + "O");
,而":" + "O"
是无效,您不能添加两个指针(":"
和 "O"
会衰减为类型为 const char*
的指针)。
您可以添加()
来指定优先级,例如(name += ":") + "O";
,它可以编译,但请注意 + "O"
部分在这里变得毫无意义。或者你可能想要 (name += ":") += "O";
就像 建议的那样,这取决于你的需求。
这个复合赋值的表达式语句
name += ":" + "O";
实际上等同于
name = name + ( ":" + "O" );
在这个子表达式中
( ":" + "O" )
字符串文字被转换为指向其第一个元素的指针。但是二元运算符 + 没有为指针定义。所以编译器报错。
您可以将原始语句拆分为两个语句,例如
name += ":";
和
name += "O";
在这种情况下,将使用为 class std::basic_string 定义的运算符 + 接受类型为 const char *
.
的参数
我有代码,但出现编译错误。 我期待左右运算符顺序评估。 '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 开始,您可以使用 user-defined-literal ""s
:[= 将 +
放入 "string mode" 20=]
name += ""s + ":" + "O"
分组规则是固定在语言 语法 中的,尽管用 operator precedence and associativity.
来思考很方便根据operator precedence,operator+
的优先级高于operator+=
,那么name += ":" + "O";
被解释为name += (":" + "O");
,而":" + "O"
是无效,您不能添加两个指针(":"
和 "O"
会衰减为类型为 const char*
的指针)。
您可以添加()
来指定优先级,例如(name += ":") + "O";
,它可以编译,但请注意 + "O"
部分在这里变得毫无意义。或者你可能想要 (name += ":") += "O";
就像
这个复合赋值的表达式语句
name += ":" + "O";
实际上等同于
name = name + ( ":" + "O" );
在这个子表达式中
( ":" + "O" )
字符串文字被转换为指向其第一个元素的指针。但是二元运算符 + 没有为指针定义。所以编译器报错。
您可以将原始语句拆分为两个语句,例如
name += ":";
和
name += "O";
在这种情况下,将使用为 class std::basic_string 定义的运算符 + 接受类型为 const char *
.