【问题标题】:Logical Operators: is AND better than OR?逻辑运算符:AND 比 OR 更好吗?
【发布时间】:2009-01-19 11:29:19
【问题描述】:

抱歉,这是一个 comp-sci 101 问题。我只是不确定我是否遗漏了一些明显的东西。

假设某些用户输入引发了错误,我想捕捉它并返回一些反馈。错误将是一个数字,0 - 8。0 表示“无错误”。如果错误为 3,我想给用户非常具体的反馈(比方说,不允许数字)。对于其他 7 种可能性,我只想结束脚本并回显错误。

我正在解决这个问题并决定这样做:

$no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE;
if (!$no_errors)
echo $error_msg['$_error'];
$error_3 ($no_errors && $_error == 3) ? TRUE : FALSE;
if ($error_3)
   bunch of stuff happens;
else
   bunch of other stuff;

无论如何,我当时注意到第一行的 OR 运算符,并认为使用 AND 运算符可能会更好/更安全。但是我思考得越多,我看到的差异就越小。

所以真正的问题是,如果您想消除特定变量的两种可能性,AND 和 OR 是否相同,或者在逻辑/功能上是否更优化?

【问题讨论】:

  • 不要为询问开发的基础知识而道歉,即使经过 20 年的编程,我也经常编写微基准和测试应用程序来证明基础知识。证明您的假设是掌握交易的一个重要方面。
  • 另外三元编程导致可读性差,我总是避免它。

标签: php error-handling logic


【解决方案1】:

如果你使用 switch 语句会更易读:

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}

【讨论】:

  • 使用 cmets 也更容易注释
【解决方案2】:

首先,我认为我建议使用另一种识别错误的方法,而不是使用“幻数”。它们很难维护,因为您很容易忘记“3”的含义。看起来您的语言是 PHP,它支持异常。我建议使用它们,你可以在这里阅读更多关于它们的信息:http://dk.php.net/exceptions

至于逻辑运算符,实际上并没有任何被认为是“好的做法”。使用你想要的。如果您无法确定表达式何时为真/假,请尝试制作真值表:http://en.wikipedia.org/wiki/Truth_table

【讨论】:

    【解决方案3】:

    在性能方面,请记住,在大多数语言中,评估都是惰性的。使用 OR,如果第一个条件为真,它将返回真而不评估第二个条件。对于 AND,如果第一个条件为 false,它将返回 false,而不评估第二个。

    否则,运营商本身的表现并没有真正的不同。使用对您来说最易读的内容。

    【讨论】:

      【解决方案4】:

      逻辑上以下是相同的(请原谅我的伪代码)

      (! expression_one || ! expression_two) /** this is the same as the one below **/
      ! (expression_one && expression_two)
      

      从功能上讲,哪一个更优化?它们都和彼此一样最佳。如果第一个表达式为真(在 || 情况下)或假(在 && 情况下),两种方式(&& 和 ||)都允许短路

      【讨论】:

        【解决方案5】:

        最好的是可以帮助更快地阅读代码的那个。这是您可以在这里以及可能在数百万其他地方进行的唯一真正的优化。

        【讨论】:

          【解决方案6】:

          这看起来更容易阅读:

            if($_error==3)
                do stuff;
              else if($_error>0)
                do some other stuff
              else
                do normal stuff
          

          没有人注意到你可能会赢的微秒。

          【讨论】:

            【解决方案7】:
            1. 就我个人而言,我会避免使用这些数字,而是使用常量。除了更易于维护之外,它们还使编码本身变得更加容易,并允许您在明天更新值,例如如果某些情况迫使您将数字从 3 更改,则您必须仔细查看所有代码
            2. 按照 gkrogers 的建议,开关 在完成同样的事情的同时 更容易阅读和维护

            【讨论】:

              【解决方案8】:

              在性能方面,我相信它们非常相似(参见 wvanbergen 的帖子),但是在行为上存在明显差异。我认为您当前的帖子可能没有达到您希望的效果。如果您在第一行中 $_error = 3,那么您将有 $no_errors = false。当您正在检查两个都需要满足的条件时,这两个条件可能更合适。

              有时我发现检查我的逻辑的最简单方法就是大声说出我想要的东西。例如,“如果错误代码是not 0 and not 3,我们没有错误”

              我通常发现在这种只有几个变量的情况下,我用英语写句子的方式为我提供了最直观(和准确)的方法来确定逻辑运算符。

              如果您在此过程后发现代码看起来很乱,那么您可能会发现关于德摩根定律的 this 链接很有用

              【讨论】:

                【解决方案9】:

                (A || B) = !(A && B)。所以真的没什么区别

                编辑: (A || B) = !(A && B) 是错误的。感谢评论。正确的形式是 (!A || !B) = !(A && B)。

                对不起

                【讨论】:

                • 嘿,这不是真的。德摩根定律:(!A || !B) == !(A && B)
                • 那是完全正确的,我的错 : (.
                【解决方案10】:

                如果你使用:

                $no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;
                

                这意味着如果 $error != 0 AND $error != 3 这是无效的逻辑,因为 $error 不能 == 到 3 和 0 它可以是 3 OR 0 但不能同时是两者。
                在上面的示例中,如果 $error = 0 那么它将评估为 FALSE 因为它不是 3 && 0 您正在寻找它是 3 || 0.

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-18
                  • 2023-01-31
                  • 1970-01-01
                  • 2023-03-12
                  相关资源
                  最近更新 更多