我刚刚遇到了一个布尔人的简单问题
如果我有一个像这样的if语句:!(!A && !B) && B
,它到底是怎么回事?
我认为它与A && B
相同(反转括号内的条件),但显然不是..这是困扰我的
所以,有人想详细说明它是如何发生的,因为我觉得我在这里错过了一些东西吗?
答案 0 :(得分:3)
!(!A && !B) && B
是(A || B) && B
的视线,你忘了将其反转为或。反过来,顺便说一句就是B。
答案 1 :(得分:1)
!(!A && !B) = (A || B)
所以
!(!A && !B) && B = (A || B) && B = A && B || B = B
最终结果只是B
答案 2 :(得分:1)
不幸的是,在一般情况下,你不能像在离散数学课那样在编程中使用逻辑标识。
正如HashPsi和Bas van Stein所提到的,从逻辑的角度来看,你的表达式相当于B.在现实世界中,你可以拥有以下代码:
def A():
throw StupidException()
def B():
return True
!(!A() && !B()) && B() # throws exception
B() # returns True
从技术上讲,你的表达式与B语言有很大不同。你可以说这是一个非常具体的例子,但实际上你的大多数函数都有一些副作用,所以一般来说你永远不能假设数学逻辑适用于布尔表达式。
作为布尔表达式排序很重要的真实示例,您可以考虑以下惯用C ++代码:
if (foo && foo->bar()) {do something}
上面的代码会在调用bar方法之前检查foo是否为null。如果你只是重新安排那个表达方式,那么你会感到迷恋:
if (foo->bar() && foo) {do something}
如果foo == nullptr,foo-> bar将导致程序终止,因为foo-> bar()将在检查foo值之前尝试调用。