我正在阅读C++,我正在阅读关于优先顺序的一节。关于优先顺序(C++)
有,我不太明白的例子,那就是:
11 > 5 || 6 < 15 && 7 >= 8
“这个逻辑表达式产生不同的结果,取决于||或& &是否首先被计算。如果| |首先被评估,表达式评估为假如果& &首先被评估,则表达式评估为真。
如果有人能解释为什么在任何情况下都是真/假,我将不胜感激。感谢您的时间。
我正在阅读C++,我正在阅读关于优先顺序的一节。关于优先顺序(C++)
有,我不太明白的例子,那就是:
11 > 5 || 6 < 15 && 7 >= 8
“这个逻辑表达式产生不同的结果,取决于||或& &是否首先被计算。如果| |首先被评估,表达式评估为假如果& &首先被评估,则表达式评估为真。
如果有人能解释为什么在任何情况下都是真/假,我将不胜感激。感谢您的时间。
如果||
首先被评估,您将得到((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false
。
如果& &首先被评估,您有(11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true
。
如果||
首先计算:
(11 > 5 || 6 < 15) && 7 >= 8
(true || false) && false
true && false
false
如果&&
首先计算:
11 > 5 || (6 < 15 && 7 >= 8)
true || (true && false)
true || false
true
&&
具有海格优先级比||
,所以应该没有if
。
11>5
的计算结果为true,这就是整个表达式的值。 ||
运算符的第二个操作数(即6 < 15 && 7 >= 8
)将不会被评估。
运算符&&
和||
的优先级由语言定义,所以引用文本中的“if”没有多大意义。
“首先评估”一词具有误导性。这不是子表达式评估的顺序,它是子表达式与||
和&&
运算符关联的方式。
11 > 5 || 6 < 15 && 7 >= 8
由于关系运算符的优先级高于(即,,结合除更紧密地)的||
和&&
运营商,上述等效于:
(11 > 5) || (6 < 15) && (7 >= 8)
这又相当于:
true || true && false
碰巧,&&
具有比||
更高的优先级,所以以上相当于:
true || (true && false)
减少到:
true || false
是
true
在另一方面,如果||
有更高的优先级比& &`,然后
true || true && false
将相当于
(true || true) && false
或
true && false
这是
false
知道,真的有在这里没有选择是很重要的。该语言明确指出&&
比||
更紧密,所以11 > 5 || 6 < 15 && 7 >= 8
无法评估为false
。
它发生,不像大多数运营商来说,&&
和||
运营商的操作数严格左到右的顺序计算,用正确的操作并不是在所有的评估,如果左操作数的值是否足够以确定结果。这就是所谓的“短路评估”,它可以让你写下如下内容:
if (ptr != NULL && *ptr == 42)
无惧于解除引用空指针。但在这个特殊情况下,这并不重要,因为这些子表达式都没有副作用。三个子表达式11 > 5
,6 < 15
和7 >= 8
可以以6个可能的顺序中的任何一个进行评估,其最终结果完全相同。
我将解释以下方法。让我们忘掉原始表达式,并使用符号名称a,b和c而不是关系。
然后我们会得到两种形式的记录
(a || b) && c
和
a || (b && c)
在我们其实运营商& &的两个操作数首例。如果至少一个操作数为假,那么整个表达式也等于假。现在让我们回到原始表达式。作为Ç对应于
7 >= 8
它等于false,所以整个表达式(a || b) && c
等于假。
在第二种情况下,我们也有两个operator ||操作数。如果至少有一个操作数等于true,那么整个表达式就等于true。作为一个对应于原始表达式
11 > 5
等于真,那么整个表达式a || (b && c)
也等于真。
你从哪里得到报价?在C++和其他具有这些运算符的语言中,首先评估&& *。没有'如果'关于它。 – EJP
@EJP:'&&'比'||'更高的优先级,但这并不意味着&&会首先被评估。在这种情况下,'&&'根本不被评估。 – neverhoodboy