【问题标题】:Regarding Order of Precedence (c++)关于优先顺序(c++)
【发布时间】:2014-02-18 02:38:36
【问题描述】:

我正在阅读 C++,我正在阅读关于优先顺序的部分。

有一个例子我不太明白,那就是:

11 > 5 || 6 < 15 && 7 >= 8

“这个逻辑表达式产生不同的结果,具体取决于是先计算 || 还是 &&。如果先计算 ||,则表达式计算结果为 false。如果先计算 &&,则表达式计算结果为 true。”

如果有人能解释为什么它在任何一种情况下都是真/假,我将不胜感激。感谢您的时间。

【问题讨论】:

  • 你从哪里得到的报价单?在 C++ 和其他具有这些运算符的语言中,首先计算 && 。没有“如果”。
  • @EJP: &amp;&amp; 的优先级高于 ||,但这并不意味着首先评估 &amp;&amp;。在这种情况下,&amp;&amp; 根本不会被评估。

标签: c++ logical-operators boolean-expression operator-precedence


【解决方案1】:

如果首先评估 ||

(11 > 5 || 6 < 15) && 7 >= 8
(true || false) && false
true && false
false

如果首先评估&amp;&amp;

11 > 5 || (6 < 15 && 7 >= 8)
true || (true && false)
true || false
true

【讨论】:

    【解决方案2】:

    &amp;&amp;|| 运算符的优先级由语言定义,因此引用文本中的“if”没有多大意义。

    “首先评估”这句话具有误导性。计算子表达式的顺序并不重要,重要的是子表达式与 ||&amp;&amp; 运算符的关联方式。

    11 > 5 || 6 < 15 && 7 >= 8
    

    由于关系运算符的优先级高于(即比绑定更紧密)||&amp;&amp; 运算符,因此上述等价于:

    (11 > 5) || (6 < 15) && (7 >= 8)
    

    这又相当于:

    true || true && false
    

    碰巧&amp;&amp;的优先级高于||,所以上面的等价于:

    true || (true && false)
    

    归结为:

    true || false
    

    这是

    true
    

    另一方面,if || 的优先级高于 &&`,则

    true || true && false
    

    相当于

    (true || true) && false
    

    true && false
    

    这是

    false
    

    重要的是要知道这里确实没有选择。该语言明确指出&amp;&amp;|| 绑定得更紧密,因此11 &gt; 5 || 6 &lt; 15 &amp;&amp; 7 &gt;= 8 无法评估为false

    碰巧,与大多数运算符不同,&amp;&amp;|| 运算符的操作数严格按照从左到右的顺序计算,如果左边的值完全不计算右边的操作数操作数足以确定结果。这称为“短路评估”,它可以让您编写如下内容:

    if (ptr != NULL && *ptr == 42)
    

    不用担心取消引用空指针。但这在这种特殊情况下并不重要,因为没有一个子表达式有副作用。三个子表达式 11 &gt; 56 &lt; 157 &gt;= 8 可以按 6 种可能的顺序中的任何一种进行计算,最终结果完全相同。

    【讨论】:

      【解决方案3】:

      &amp;&amp; 的优先级高于||,所以应该没有if

      11&gt;5 的计算结果为真,这就是整个表达式的值。 || 运算符的第二个操作数 6 &lt; 15 &amp;&amp; 7 &gt;= 8 不会被计算。

      【讨论】:

        【解决方案4】:

        如果首先评估||,您将得到((11 &gt; 5) || (6 &lt; 15)) &amp;&amp; (7 &gt;= 8) == (true || true) &amp;&amp; false == true &amp;&amp; false == false

        如果先评估 &&,则您有 (11 &gt; 5) || ((6 &lt; 15) &amp;&amp; (7 &gt;= 8)) == true || (true &amp;&amp; false) == true || true == true

        【讨论】:

          【解决方案5】:

          我将通过以下方式进行解释。让我们忘记原始表达式,将使用符号名称 abc 来代替关系。

          那么我们会得到两种形式的记录

          ( a || b ) && c
          

          a || ( b && c )
          

          在第一种情况下,我们实际上有两个运算符 && 操作数。如果至少一个操作数为假,则整个表达式也等于假。现在让我们回到原来的表达式。因为 c 对应于

          7 >= 8
          

          等于 false 所以整个表达式( a || b ) &amp;&amp; c 等于 false。

          在第二种情况下,我们还有两个运算符 || 的操作数。如果至少一个操作数等于真,则整个表达式等于真。因为a对应原表达式

          11 > 5
          

          等于 true 那么整个表达式 a || ( b &amp;&amp; c ) 也等于 true。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-11
            • 2017-04-21
            • 1970-01-01
            • 2010-09-11
            相关资源
            最近更新 更多