【问题标题】:Why does c++ && operator need priority [duplicate]为什么c ++ &&运算符需要优先级[重复]
【发布时间】:2019-11-22 12:34:06
【问题描述】:
test1() && test2() != test3();

在此示例中,尽管!= 的优先级高于&&,但评估顺序始终为:如果test1() 然后test2 != test3()

为什么 c++ && 运算符需要优先级?您能否提供一个运营商显示其隐私但不进行评估的示例?

【问题讨论】:

  • 这就是所谓的短路布尔求值。
  • 您是在问为什么&& 运算符有短路行为吗?
  • 你想要这种行为:if (a != null && a->foo() == 1)
  • 我询问运算符 && 在表达式中使用其优先级而不是短路行为的示例
  • @Igor 它需要优先级(priority)的概念来定义如何评估表达式。例如,&& 的优先级高于||,因此a||b&&c 将被评估为a||(b&&c)。但是,== 的优先级高于&&,因此a==b&&c 将被评估为(a==b)&&c。因此,无论评估顺序如何,优先级的概念仍然非常重要。

标签: c++


【解决方案1】:

!= 的优先级较高意味着

test1() && test2() != test3()

相当于表达式的main top操作

test1() && (test2() != test3())

而不是

(test1() && test2()) != test3()

所以,这是subexpr1 && subexpr2 形式的表达式。 != 操作在第二个子表达式中。指定逻辑 AND 运算,以便首先执行左侧操作数,然后执行第二个运算符(如果左侧结果为 false,则根本不执行)。

【讨论】:

  • 有趣的是,我们的答案非常相似:),尤其是在开始时。
  • @SergeyA wow :D 这是你叫 Jinx! 的地方吗?
【解决方案2】:

问题措辞具有误导性,我花了一段时间才理解 OP 的问题。当优先级规则应用于此语句时,并且!= 的优先级高于&&,则意味着

test1() && test2() != test3();

在语义上等价于

test1() && (test2() != test3());

而不是

(test1() && (test2()) != test3();

但是,如果设置了短路规则,编译器将首先执行test1(),如果发现为false,则不会执行test2()test3()。这并不意味着不遵循优先规则。

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2017-06-02
    • 1970-01-01
    • 2015-04-17
    • 2015-08-07
    相关资源
    最近更新 更多