Php 逻辑运算符:是且优于或?
抱歉,如果这是一个comp sci 101问题。我只是不确定我是否遗漏了一些明显的东西 假设某个用户输入抛出了一个错误,我想捕捉它并返回一些反馈。错误将是一个数字,0-8。0表示“无错误”。如果错误为3,我想给用户非常具体的反馈(比如说,不允许数字)。对于其他7种可能性,我只想结束脚本并回显错误 我正在考虑这个问题,并决定继续: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
$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。当您检查两个条件时,这两个条件都需要满足,可能更合适 有时候,我发现检查我的逻辑最简单的方法就是大声说出我想说的话。例如,“如果错误代码为not0和not3,则我们没有错误” 我通常发现,在这种只有几个变量的情况下,我用英语写句子的方式为我提供了确定逻辑运算符的最直观(和准确)的方法 如果在此过程后您发现代码看起来很混乱,那么您可能会发现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
嘿,那不是真的。德摩根定律:(!A | |!B)=!(A和B)那完全是真的,我的错:(.更容易用注释注释。不要为询问开发的基本原理而道歉,即使在编程20年后,我也经常编写微基准测试和测试应用程序来证明基本原理。证明你的假设是掌握你的交易的一个重要方面。三元编程也会导致可读性差,我总是避免信息技术
$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;