c++中==运算符的结合性
Associativity of == operator in c++
我有这段 C++ 代码:
std::vector<int> v1;
std::vector<int> v2;
...
if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end())
{
return 0;
}
首先计算哪个表达式?调试时,首先评估“==”运算符的右侧,这是正确的行为吗?
这与结合性无关(它在 a == b == c
等表达式中发挥作用)。您要问的是运算符的操作数的评估顺序。除了一些明确列出的例外情况,这在 C++ 中是有意 未指定 的。这意味着无法保证 a
或 b
是否会在 a == b
.
中首先被评估
例外情况(保证评估顺序)是:
- 函数调用的所有参数都在函数调用本身之前求值(但顺序未指定)。
- 内置 运算符
||
和 &&
的左侧首先求值(右侧仅求值如有必要)。
- 内置运算符
,
的左侧先于右侧计算。
- 运算符
?:
中的条件在结果之前求值,并且只求一个结果。
请注意,当重载这些运算符时,&&
、||
和 ,
的特殊属性将不再适用。这正是为什么重载这三个运算符是一个 糟糕 想法的原因。
你问的不是 operator ==
的结合律,而是 order of evaluation 的结合律。并且此运算符的评估顺序未指定,因此您必须假设该顺序始终不适合您。为了安全起见,将您的声明分成两行。
我有这段 C++ 代码:
std::vector<int> v1;
std::vector<int> v2;
...
if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end())
{
return 0;
}
首先计算哪个表达式?调试时,首先评估“==”运算符的右侧,这是正确的行为吗?
这与结合性无关(它在 a == b == c
等表达式中发挥作用)。您要问的是运算符的操作数的评估顺序。除了一些明确列出的例外情况,这在 C++ 中是有意 未指定 的。这意味着无法保证 a
或 b
是否会在 a == b
.
例外情况(保证评估顺序)是:
- 函数调用的所有参数都在函数调用本身之前求值(但顺序未指定)。
- 内置 运算符
||
和&&
的左侧首先求值(右侧仅求值如有必要)。 - 内置运算符
,
的左侧先于右侧计算。 - 运算符
?:
中的条件在结果之前求值,并且只求一个结果。
请注意,当重载这些运算符时,&&
、||
和 ,
的特殊属性将不再适用。这正是为什么重载这三个运算符是一个 糟糕 想法的原因。
你问的不是 operator ==
的结合律,而是 order of evaluation 的结合律。并且此运算符的评估顺序未指定,因此您必须假设该顺序始终不适合您。为了安全起见,将您的声明分成两行。