我正在阅读一本C书,并且不理解它要求我评估的声明。
以下是声明!(1 && !(0 || 1))
我可以在这里理解一些事情......这就是我到目前为止所做的事情,not(1 and not(0 or 1))
所以它是not 1 and not 0 or 1
?或者是not 1 and 0 or 1
?这两个!
是否会像双重否定一样取消对方?答案是true
,但我期望false
。
有人可以解释一下吗?
答案 0 :(得分:5)
使用De Morgan定律简化原始表达式:!(1 && !(0 || 1))
。当否定括号逻辑表达式时,否定将应用于每个操作数并更改运算符。
!(1 && !(0 || 1)) // original expression
!1 || !!(O || 1) // by De Morgan's law
!1 || (0 || 1) // the two !!'s in front of the second operand cancel each other
0 || (0 || 1) // !1 is zero
0 || 1 // the second operand, 0 || 1, evaluates to true because 1 is true
1 // the entire expression is now 0 || 1, which is true
答案是对的。
其他几个答案都说括号确定评估顺序。那是错的。在C中,优先级与评估顺序不同。优先级确定哪些操作数由哪些运算符分组。评估的确切顺序未指定。逻辑运算符是一个例外:它们以严格从左到右的顺序进行评估,以便实现短路行为。
答案 1 :(得分:3)
(0 || 1) == 1
!1 == 0
1 && 0 == 0
!0 == 1
也称为true :) 请注意,||
和&&
是短路运营商,但在这种情况下,您仍需要评估右侧,因为运营商不短路< / p>
答案 2 :(得分:3)
!(1 && !(0 || 1)) => not(1 and not(0 or 1))
not(1 and not(0 or 1)) => not(1 and (0 and 1)) // !(a or b) = a and b
not(1 and (0 and 1)) => not(0) => 1 => true
答案 3 :(得分:2)
!(1 && !(0 || 1))
=> ! (1 && !(1)) //0 || 1 is 1
=> ! (1 && 0) // !1 is 0
=> !0 // 1 && 0 is 0
=> 1 // !0 is 1
=>true
答案 4 :(得分:2)
如果A = 1 A&amp;&amp; B = B.所以内部的最终表达式(....)是!(!(0 || 1)),它是0 || 1和0 + 1 = 1因此答案是真的
答案 5 :(得分:2)
!(1 && !(0 || 1)) => !(1 && !(1)) => !(1 && !1) => !(1 && 0) => !(0) => !0 => 1(true)
答案 6 :(得分:1)
从最深的嵌套开始,向外工作,逐件添加;
(0 || 1) = (0 OR 1) = 1
!(0 || 1) = !1 = NOT 1 = 0
1 && !(0 || 1) = 1 && 0 = 1 AND 0 = 0
!(1 && !(0 || 1)) = !0 = NOT 0 = 1
答案 7 :(得分:1)
要评估这一点,请从最里面的括号开始,然后按照这样的方式解决问题:
not(1 and not(0 or 1)) -> not(1 and not(1)) -> not(1 and 0) -> not(0) -> 1 -> true.
答案 8 :(得分:1)
!(1 && !(0 || 1))
由于0 || 1
评估为1
,因此与
!(1 && !1)
继续
!(1 && 0)
继续
!0
所以它是1
,是真的。
答案 9 :(得分:1)
(0 || 1) --> 1
! 1 --> 0
1 && 0 --> 0
! 0 -- > 1
回答是真的
答案 10 :(得分:1)
如果您记得哪个操作订单
,这很容易 !(1 && !(0 || 1)) = !(1 && !(1)) = !(1 && 0) = !(0) = 1