C++ c+中==运算符的结合性+;
我有一段c++代码:C++ c+中==运算符的结合性+;,c++,associative,C++,Associative,我有一段c++代码: std::vector<int> v1; std::vector<int> v2; ... if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end()) { return 0; } std::vector v1; std::向量v2; ... if(v1.insert(v1.end(),v2.begin(),v2.end())==v1.end()) { 返回0; } 将首先计算哪个表
std::vector<int> v1;
std::vector<int> v2;
...
if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end())
{
return 0;
}
std::vector v1;
std::向量v2;
...
if(v1.insert(v1.end(),v2.begin(),v2.end())==v1.end())
{
返回0;
}
将首先计算哪个表达式?调试时,首先计算“==”运算符的右侧,这是正确的行为吗?这与关联性无关(在
a==b==c等表达式中起作用)。您要问的是运算符操作数的求值顺序。使用一些显式列出的异常,这是C++中有意未指定的。这意味着不能保证a
或b
将首先在a==b
中求值
例外情况(保证评估顺序)为:
- 函数调用的所有参数都在函数调用本身之前求值(但顺序未明)
- 首先计算内置运算符
|
和&&
的左侧(仅在必要时计算右侧)
- 内置运算符
,的左侧在右侧之前计算
?:
中的条件在结果之前求值,并且只求值一个结果请注意,
&&
、|
和、
的特殊属性在重载这些运算符时停止应用。这正是为什么重载这三个操作符是一个坏主意的原因。您不是在要求操作符==
的关联性,而是关于。这个操作符的求值顺序是未指定的,所以你必须假设这个顺序总是不适合你的。为了安全起见,将语句分成两行。有帮助吗?这是未定义的行为。除了一些特殊的运算符(&&、| |、逗号、:)之外,标准没有定义操作数的求值顺序。你的意思是不确定吗?@πνταῥεῖ 是的,很好。@πάνταῥεῖ: 您要查找的单词是“unspecified”(不要与“undeterminatevalues”(不确定值)混淆)。应该注意的是,这些异常非常重要,请参阅@BM我正在努力扩展答案,我希望现在就涵盖它。