If statement 布尔规则困扰着我

If statement 布尔规则困扰着我,if-statement,boolean,If Statement,Boolean,我刚刚遇到了一个很简单的布尔问题 如果我有这样一个If语句:!(!A&&!B)&&B,它到底是怎么回事 我认为它与A&&B(将括号内的条件倒置)相同,但显然不是。。这让我很烦 那么,有人愿意详细说明它到底是如何发展的,因为我觉得我遗漏了一些东西吗?!(!A&&!B)&&B是sams,因为(A&&B)&&B您忘记了将and反转为or。顺便说一句,这只是B。!(!A&&!B)=(A | | B) 所以 !(!A&&!B)&&B=(A | B)&&B=A&B | B=B 最后的结果只是B不幸的是,在一

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

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

我认为它与
A&&B
(将括号内的条件倒置)相同,但显然不是。。这让我很烦

那么,有人愿意详细说明它到底是如何发展的,因为我觉得我遗漏了一些东西吗?

!(!A&&!B)&&B
是sams,因为
(A&&B)&&B
您忘记了将and反转为or。顺便说一句,这只是B。

!(!A&&!B)=(A | | B)

所以

!(!A&&!B)&&B=(A | B)&&B=A&B | B=B


最后的结果只是
B

不幸的是,在一般情况下,你不能像在离散数学课上那样在编程中使用逻辑恒等式

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

几秒钟后您就被调用了;)