【问题标题】:Why exactly the output of this expression return true为什么这个表达式的输出究竟返回 true
【发布时间】:2014-11-19 00:25:02
【问题描述】:

我有这样的表达方式:

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

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

这里的关键观察:!不是,&& 是“与”运算符,而 ||是“Inclusive Or”运算符。

【问题讨论】:

  • 这是一个特定于语言的问题吗?如果需要,我可以用逻辑给出一般的答案。

标签: boolean-logic boolean-expression


【解决方案1】:

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

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 操作以及归约语句的工作原理。有了这些定义,它不可能是另一个答案,所以它就是那个答案。但是你已经知道了,因为你自己做了,得到了同样的答案……那么这个问题是什么意思?

【讨论】:

  • 不必粗鲁。我喜欢你的回答。我只是想更好地理解布尔原理。
  • @Verhaeren 我很抱歉,我并没有粗鲁的意思。我只是不确定我可以在答案中添加什么内容来为您添加任何新内容,而且答案有点生硬。
  • 我不会说它没有为我添加任何新东西。作为一名程序员,我主要处理的错误之一是由于对布尔原理的误解或缺乏理解造成的。
【解决方案2】:

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

剩下 1 && 0,这总是假的。

所以 !(false) 始终为真。

请原谅我随意混用 0/false 和 1/true。

人类评估者 (:-)。

【讨论】:

    【解决方案3】:

    处理表达式,操作顺序如下:

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

    【讨论】:

      【解决方案4】:

      分步说明:

      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。或者在你的情况下:true

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

      Dan Godkins 的《傻瓜C》

      【讨论】:

        【解决方案5】:

        !(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.
        

        【讨论】:

        • 评估确实根据括号进行。这就是他们的目的。这是他们的唯一事情。没有任何“我感觉”。
        • 是的,应该是这样。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 2011-07-31
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多