我有这个表达:
!(1 && !(0 || 1))
输出返回1 true
。那没关系。当我读到表达式时,我在检查输出之前得出了相同的结论。但我真的很感激,如果有人可以向我解释为什么返回的值是真的,那样,我将更好地理解布尔逻辑以及如何在我的代码中实现更好的求值器。
这里的关键观察:!不是,&&是"和"运算符和||是"包容性的"操作者。
答案 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.