【问题标题】:AND OR order of operationsAND OR 运算顺序
【发布时间】:2013-05-29 04:40:58
【问题描述】:

这个语句的等价物是什么?

if(cond1 AND cond2 AND cond3 OR cond4 AND cond5 AND cond6)

是吗

if((cond1 AND cond2 AND cond3) OR (cond4 AND cond5 AND cond6))

或者

if(cond1 AND cond2 AND (cond3 OR cond4) AND cond5 AND cond6)

或者

if(((cond1 AND cond2 AND cond3) OR cond4) AND cond5 AND cond6)

等等……

这一直是我一直害怕接近的事情,我只是将括号括起来( ) 中的条件。如果我的心能安定下来就好了。

【问题讨论】:

  • 使用括号消除歧义是个好主意。

标签: operator-precedence


【解决方案1】:

记住这一点的一个好方法是用数学方法思考它。

  • AND as *(乘法)
  • OR as +(加法)
  • TRUE1
  • FALSE0

因此,您可以将其视为简单的数学运算:

  • 0 * 0 = 0
  • 1 * 0 = 0
  • 1 * 1 = 1
  • 0 + 0 = 0
  • 1 + 0 = 1
  • 1 + 1 = 1

唯一可能有点令人困惑的是1 + 1 = 1,但有点不能超过1。但是,如果您将1 视为任何非零数字,那么这是有道理的。

因此,考虑到这一点,您可以应用以下逻辑:

if(cond1 AND cond2 AND cond3 OR cond4 AND cond5 AND cond6)

变成:

if(cond1 * cond2 * cond3 + cond4 * cond5 * cond6)

见:https://en.wikipedia.org/wiki/Order_of_operations

【讨论】:

  • 这是考虑布尔运算的一种非常酷的方式,它可以作为记住运算顺序的奖励助记符。杰出的。谢谢!
【解决方案2】:

在大多数语言中,AND 首先被评估, 因此

if((cond1 AND cond2 AND cond3) OR (cond4 AND cond5 AND cond 6))

是正确的选择。

对于 C#,请参阅 http://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx

对于 C,请参阅 http://en.cppreference.com/w/cpp/language/operator_precedence

对于 Java,请参阅 http://bmanolov.free.fr/javaoperators.php

【讨论】:

  • 大多数语言中:哪些不是?
【解决方案3】:

在正常的布尔连接词集合中(从逻辑的角度来看),and 的优先级高于or,因此A or B and C 实际上是A or (B and C)Wikipedia 按顺序列出它们。大多数编程语言都应该遵守这个约定,除非它们真的很奇怪。

也就是说,对于您的特定语言或环境,应该可以编造一个非常小的测试来满足自己,这是一种或另一种方式:)

【讨论】:

    【解决方案4】:

    大多数语言首先评估 AND。

    【讨论】:

      【解决方案5】:

      这完全取决于您询问的语言或环境,遗憾的是您没有指定。

      AND 的优先级可能高于 OR,也可能相反,也可能相等。

      如果您的语言是由虐待狂设计的,则可以从左到右、从右到左或从中间向外交替方向评估 :-)

      AND 的优先级高于 OR 并且它们都是从左到右关联的,这是很常见的。

      这样的话

      cond1 AND cond2 AND cond3 OR cond4 AND cond5 AND cond 6
      

      相当于:

      ((cond1 AND cond2) AND cond3) OR ((cond4 AND cond5) AND cond 6)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多