1

我正在阅读C++,我正在阅读关于优先顺序的一节。关于优先顺序(C++)

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

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

“这个逻辑表达式产生不同的结果,取决于||或& &是否首先被计算。如果| |首先被评估,表达式评估为假如果& &首先被评估,则表达式评估为真。

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

+2

你从哪里得到报价?在C++和其他具有这些运算符的语言中,首先评估&& *。没有'如果'关于它。 – EJP

+0

@EJP:'&&'比'||'更高的优先级,但这并不意味着&&会首先被评估。在这种情况下,'&&'根本不被评估。 – neverhoodboy

回答

0

如果||首先被评估,您将得到((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false

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

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

&&具有海格优先级比||,所以应该没有if

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

3

运算符&&||的优先级由语言定义,所以引用文本中的“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 < 157 >= 8可以以6个可能的顺序中的任何一个进行评估,其最终结果完全相同。

0

我将解释以下方法。让我们忘掉原始表达式,并使用符号名称a,bc而不是关系。

然后我们会得到两种形式的记录

(a || b) && c 

a || (b && c) 

在我们其实运营商& &的两个操作数首例。如果至少一个操作数为假,那么整个表达式也等于假。现在让我们回到原始表达式。作为Ç对应于

7 >= 8 

它等于false,所以整个表达式(a || b) && c等于假。

在第二种情况下,我们也有两个operator ||操作数。如果至少有一个操作数等于true,那么整个表达式就等于true。作为一个对应于原始表达式

11 > 5 

等于真,那么整个表达式a || (b && c)也等于真。