我正在阅读关于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;为了真实。“
如果有人可以解释为什么在任何一种情况下它都是真/假,我将不胜感激。感谢您的时间。
答案 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 > 5
,6 < 15
和7 >= 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。