【问题标题】:Associativity of == operator in c++C ++中==运算符的关联性
【发布时间】:2017-03-10 15:28:59
【问题描述】:

我在 c++ 中有这个 sn-p 代码:

std::vector<int> v1;
std::vector<int> v2;
...
if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end())
{
    return 0;
}

首先计算哪个表达式?调试时,首先评估“==”运算符的右侧,这是正确的行为吗?

【问题讨论】:

  • this 有帮助吗?
  • 这是未定义的行为。除了一些特定的运算符(&&、||、逗号、?:)之外,标准没有定义操作数的评估顺序。
  • @greg 这里没有 UB。您的意思是未确定
  • @πάνταῥεῖ 是的,说得好。
  • @πάνταῥεῖ:您要查找的词是“未指定”(不要与“不确定值”混淆)。

标签: c++ associative


【解决方案1】:

这与关联性无关(在a == b == c 等表达式中发挥作用)。您要问的是运算符操作数的评估顺序。除了一些明确列出的例外情况,这在 C++ 中是有意未指定的。这意味着无法保证 ab 是否会首先在 a == b 中进行评估。

例外情况(保证评估顺序)是:

  • 函数调用的所有参数都在函数调用本身之前进行评估(但顺序未指定)。
  • 内置运算符 ||&amp;&amp; 的左侧首先被评估(只有在必要时才评估右侧)。
  • 内置运算符,的左侧先于右侧求值。
  • 运算符?: 中的条件在结果之前进行评估,并且仅评估其中一个结果。

请注意,当这些运算符重载时,&amp;&amp;||, 的特殊属性将不再适用。这正是为什么重载这三个运算符是一个的想法的原因。

【讨论】:

【解决方案2】:

您要求的不是operator == 的关联性,而是order of evaluation。并且未指定此运算符的评估顺序,因此您必须假设该顺序始终对您不起作用。为了安全起见,将您的语句分成两行。

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2015-11-02
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多