Php 逻辑运算符:是且优于或?

Php 逻辑运算符:是且优于或?,php,error-handling,logic,Php,Error Handling,Logic,抱歉,如果这是一个comp sci 101问题。我只是不确定我是否遗漏了一些明显的东西 假设某个用户输入抛出了一个错误,我想捕捉它并返回一些反馈。错误将是一个数字,0-8。0表示“无错误”。如果错误为3,我想给用户非常具体的反馈(比如说,不允许数字)。对于其他7种可能性,我只想结束脚本并回显错误 我正在考虑这个问题,并决定继续: $no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE; if (!$no_errors) echo $err

抱歉,如果这是一个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运算符可能更好/更安全。但我思考得越多,就越看不出有什么不同


所以真正的问题是,如果你想消除一个特定变量的两种可能性,是和或相同,还是一种在逻辑上/功能上更优

就性能而言,请记住,在大多数语言中,评估都是惰性的。使用或,如果第一个条件为true,则它将返回true而不计算第二个条件。对于和,如果第一个条件为false,则返回false,而不计算第二个条件

否则,运营商本身的表现并没有什么不同。使用您最容易阅读的内容。

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

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


我的道歉

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

这看起来更简单:

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

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

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


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

如果使用switch语句,可读性会更好:

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

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


从功能上看,哪一个更为理想?它们都是最佳的。如果第一个表达式为真(在| | |情况下)或假(在&&case情况下)

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

有时候,我发现检查我的逻辑最简单的方法就是大声说出我想说的话。例如,“如果错误代码为not0not3,则我们没有错误”

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

如果在此过程后您发现代码看起来很混乱,那么您可能会发现De Morgan定律上的链接很有用,如果您使用:

$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;
这意味着如果$error!=0和$error!=3是无效的逻辑,因为$error不能是==到3和0它可以是3或0,但不能两者都是。
在上面的示例中,如果$error=0,那么它的计算结果将为FALSE,因为它不是3&&0,您希望它是3 | | 0

  • 就我个人而言,我将不再使用这些数字,而是使用常量。除了更易于维护外,它们还使编码本身更容易,并允许您明天更新值。例如,如果某些情况阻止您将数字从3更改,则您必须仔细查看所有代码
  • 正如罗杰斯所建议的,一个开关 同时完成同样的事情 更易于阅读和维护

  • 嘿,那不是真的。德摩根定律:(!A | |!B)=!(A和B)那完全是真的,我的错:(.更容易用注释注释。不要为询问开发的基本原理而道歉,即使在编程20年后,我也经常编写微基准测试和测试应用程序来证明基本原理。证明你的假设是掌握你的交易的一个重要方面。三元编程也会导致可读性差,我总是避免信息技术
    $no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;