关于优先顺序(c ++)

时间:2014-02-18 02:38:37

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

我正在阅读关于C ++的内容,我将讨论关于优先顺序的部分。

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

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

“这个逻辑表达式产生不同的结果,取决于是否首先计算||或&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;为了真实。“

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

5 个答案:

答案 0 :(得分:3)

如果首先评估||

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

如果首先评估&&

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

答案 1 :(得分:3)

&&||运算符的优先级由语言定义,因此&#34; if&#34;在引用的文字中没有多大意义。

短语&#34;首先评估&#34;是误导。它不是重要的子表达式的评估顺序,而是子表达式与||&&运算符的关联方式。

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

由于关系运算符的优先级高于||&&运算符的优先级(即绑定比其更紧密),因此上述内容相当于:

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

反过来相当于:

true || true && false

碰巧,&&的优先级高于||,因此上述内容相当于:

true || (true && false)

减少到:

true || false

true

另一方面,如果 ||的优先级高于&amp;&amp;`,那么

true || true && false

等同于

(true || true) && false

true && false

false

知道这里真的没有选择很重要。该语言明确指出&&||绑定得更紧密,因此11 > 5 || 6 < 15 && 7 >= 8无法评估false

与大多数运算符不同,&&||运算符的操作数以严格的从左到右的顺序进行计算,如果是,则根本不对正确的操作数进行求值。左操作数的值足以确定结果。这称为&#34;短路评估&#34;,它允许您编写如下内容:

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

无需担心取消引用空指针。但在这种特殊情况下,这并不重要,因为没有子表达式具有副作用。三个子表达式11 > 56 < 157 >= 8可以在6个可能的订单中的任何一个中进行评估,并且具有完全相同的最终结果。

答案 2 :(得分:1)

&&的优先级高于||,因此不应该if

11>5计算结果为true,这是整个表达式的值。 ||运算符的第二个操作数(6 < 15 && 7 >= 8)将不会被评估。

答案 3 :(得分:0)

如果首先评估||,则会获得((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false

如果&amp;&amp;首先评估,你有(11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true

答案 4 :(得分:0)

我将以下列方式解释。让我们忘记原始表达式,并使用符号名称 a b c 代替关系。

然后我们将获得两种形式的记录

( a || b ) && c

a || ( b && c )

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

7 >= 8

它等于false,因此整个表达式( a || b ) && c等于false。

在第二种情况下,我们还有两个operator ||的操作数。如果至少一个操作数等于true,则整个表达式等于true。由于 a 对应原始表达

11 > 5

等于true,则整个表达式a || ( b && c )也等于true。