同样,如果第一个操作数为逻辑或是真的,那么整个或条件必须评估为真,第二个操作数不需要被评估。
短路评估提出了另一个机会,以显示为什么运营商,导致的副作用不应该被使用在复合表达式。考虑下面的代码片断:
一
二
如果(X = = = 1 & Y + + = = 2)
做某事
如果X不等于1,有条件的必须是假的,所以Y + +永远不会得到评价!因此,Y只会递增,如果x的值为1,这可能不是程序员想要的!
与逻辑或运算,新程序员有时混淆逻辑与运算符(&&)与按位AND运算符(&)。
混合和ORs
混合逻辑和逻辑或运算符在相同的表达往往是不能避免的,但它是一个充满潜在危险的区域。
许多程序员认为,逻辑和逻辑或具有相同的优先级(或忘记,他们不这样做),就像加法/减法和乘法/除法做的一样。然而,逻辑与逻辑或具有更高的优先级,因此逻辑和运营商将评估在逻辑或运算符(除非他们已经括号)。
因此,新的程序员会经常写表达式如value1 value2和3 | |。因为逻辑和具有更高的优先级,这种评估为value1 | |(2和3)(value1 value2,不| |)和3。希望这是程序员想要的!如果程序员假设左到右的评价(如发生与加法/减法,或乘法/除法),程序员将得到一个结果,他或她没有期待!
当混合逻辑与和逻辑或同一种表达,它是一个好主意,明确每个运算符和操作数括号。这有助于防止优先错误,使您的代码更容易阅读,并清楚地定义了如何使用表达式来评估。例如,而不是写在| |值value1 value2和珍惜,最好写(value1、value2)| |(3和珍惜)。
De Morgan定律
许多程序员也犯了这样的错误!(X和Y)是同一件事!和及!不幸的是,你不能“分配”的逻辑,而不是以那种方式。
De Morgan定律告诉我们,在这种情况下,逻辑上的不应该是如何分布的:
!(X和Y)相当于!X | |!Y
!(X | | Y)相当于!和及!Y
换句话说,当你分配逻辑不,你也需要翻转逻辑和逻辑或,反之亦然!
这有时可能是有用的,当试图弥补复杂的表达式更容易阅读。
逻辑异或是一个逻辑运算符,在一些语言中,用于测试是否奇数是真的提供了条件。
C++并没有提供一个逻辑异或操作。不同于逻辑或逻辑与、异或不能短路计算。因此,进行异或操作的逻辑或逻辑和运营商的挑战。然而,你可以很容易地模仿逻辑异或使用不等于操作符(!=):
一
如果(一个!= B)…/ /一个异或B,假设A和B是布尔值
这可以扩展到多个操作数如下:
一
如果(一个!= B!= C!= D)…/ /一个异或XOR异或B C D,假设,B,C,和D的布尔值
注意上面的XOR模式只工作,如果操作数是布尔型(非整数)。如果你想要这个工作的整数,你可以static_cast他们的书。
如果你需要一个形式,与非布尔异或操作数,你可以使用这个稍微复杂的形式:
一
如果(static_cast <布尔>(一)!= static_cast <布尔>(B)!= static_cast <布尔>(C)!= static_cast <布尔>(D))…/ /一个异或XOR异或B C D,任何可转换为bool类型
在这种形式中,逻辑不是运算符用来将操作数转换为一个逆布尔值。然而,异或计算同样的方式时,所有的操作数都倒了,所以这并不影响结果。
测验
评估以下:
(1)真正的和真实的)| |假
(2)假和真)| |真实
(3)假和真)| |假| |真实
(4)5>6 | | 4 > 3)和(7 - 8)
5)!(7>6 | | 3>4)
测验的答案
注:在下面的答案中,我们“解释我们的工作”,通过向你展示的步骤,以获得最终的答案。步骤是用一个= >符号分开的。例如“(真| |假)= >真”意味着我们评估”(真| |假)”到“真实”的价值。