为什么这个表达式的输出返回true

时间:2014-11-19 00:25:03

标签: boolean-logic boolean-expression

我有这个表达:

!(1 && !(0 || 1))

输出返回1 true。那没关系。当我读到表达式时,我在检查输出之前得出了相同的结论。但我真的很感激,如果有人可以向我解释为什么返回的值是真的,那样,我将更好地理解布尔逻辑以及如何在我的代码中实现更好的求值器。

这里的关键观察:!不是,&&是"和"运算符和||是"包容性的"操作者。

5 个答案:

答案 0 :(得分:3)

最里面的表达式(0 || 1)始终为true。 所以!(0 || 1)总是假的。

留下1&& 0,总是假的。

所以!(假)总是如此。

请原谅我的自由混合0 /假和1 /真。

人类评估员(: - )。

答案 1 :(得分:3)

当你说“为什么这是真的?”时,你真正在问什么。

0 = false
1 = true

AND && table
0 0 -> 0
0 1 -> 0
1 0 -> 0
1 1 -> 1

OR || table
0 0 -> 0
0 1 -> 1
1 0 -> 1
1 1 -> 1

NOT ! table
0 -> 1
1 -> 0

如果括号暗示“首先执行此操作”,则语句将使用上表删除:

!(1 && !(0 || 1))
!(1 && !1)
!(1 && 0)
!0
1

但我不知道“为什么”这是真的。因为这就是AND操作,OR操作是什么,NOT操作是什么,以及如何减少语句的工作原理。有了这些定义,它就不是另一个答案,所以就是答案。但是你已经知道了,因为你自己做了并得到了相同的答案......那么问题是什么意思呢?

答案 2 :(得分:2)

按照操作顺序处理表达式:

  !(1 && !(0 || 1))
= !(1 && !(1))
= !(1 && 0)
= !(0)
= 1

答案 3 :(得分:2)

分步说明:

1 =真 0 =错误

起点:!(1&&!(0 || 1))


让我们从最内层的表达开始:!(0 || 1)

Var1 || Var2 = 
Var1 or Var2 = 
If Var1 or Var2 is 1 or both are 1, the result is 1. 

(0 || 1) = 0 or 1  -> the second variable is 1 so the expression is 1.

将结果(0 || 1)= 1插入起始点:!(1&&!(1))

! = not (inverts the value of what is behinde)
!1 = 0
!0 = 1

!(0 || 1) = !(1) = 0

将结果!(1)= 0插入起始点:!(1&& 0)

所以我们有!(1&& 0)

Var1 && Var2 = And = 
the opossite of or =
If Var1 AND Var2 are both 1, the result is 1. Else it is 0 =
If Var1 or Var2 is 0, the result is zero

1 && 1 = 1
1 && 0 = 0
everything else: 0

所以剩下这个:!(0)

提醒:! = not =反转它背后的表达式。所以!0 = 1(和!1 = 0)

这是1.或者在你的情况下:是真的

一本好书,适合初学C程序员和想要以简单易懂的方式学习编程和逻辑的人:

Dan Godkins的C傻瓜

答案 4 :(得分:1)

!(1&&!(0 || 1))

由于您使用了括号,因此根据它们进行评估。

首先,评估最里面的括号。

0 || 1                 => always true.
!(0 || 1)              => !(true)       => always false.
1 && !(0 || 1)         => 1 && false    => always false.
!(1 && !(0 || 1))      => !false        => always true.