评价本声明

时间:2013-08-13 04:20:41

标签: c if-statement evaluation

我正在阅读一本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

有人可以解释一下吗?

11 个答案:

答案 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)

  1. (0 || 1) == 1
  2. !1 == 0
  3. 1 && 0 == 0
  4. !0 == 1也称为true :)
  5. 请注意,||&&是短路运营商,但在这种情况下,您仍需要评估右侧,因为运营商短路< / 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