布尔规则让我烦恼

时间:2015-09-02 16:19:03

标签: if-statement boolean

我刚刚遇到了一个布尔人的简单问题

如果我有一个像这样的if语句:!(!A && !B) && B,它到底是怎么回事?

我认为它与A && B相同(反转括号内的条件),但显然不是..这是困扰我的

所以,有人想详细说明它是如何发生的,因为我觉得我在这里错过了一些东西吗?

3 个答案:

答案 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值之前尝试调用。