很抱歉,如果这是一个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相同,还是逻辑上/功能上更优化?
答案 0 :(得分:20)
如果使用switch语句,它将更具可读性:
switch ($_error) {
case 0;
nothing happens;
break;
case 3:
bunch of stuff happens;
break;
default:
bunch of other stuff;
break;
}
答案 1 :(得分:4)
首先,我认为我建议使用另一种识别错误的方法,而不是使用“魔术数字”。它们很难维护,因为你很容易忘记“3”的含义。看起来您的语言是PHP,它支持异常。我建议您使用它们,您可以在此处详细了解它们:http://dk.php.net/exceptions
对于逻辑运算符,实际上没有任何被认为是“良好实践”。用你想要的。如果您无法确定表达式何时为真/假,请尝试制作真值表:http://en.wikipedia.org/wiki/Truth_table
答案 2 :(得分:2)
在性能方面,请记住,评估在大多数语言中都是懒惰的。使用OR,如果第一个条件为真,它将返回true而不评估第二个条件。对于AND,如果第一个条件为false,则返回false,而不评估第二个条件。
否则,运营商本身的表现并没有真正的不同。使用最易读的内容。
答案 3 :(得分:1)
最好的是帮助你更快地读取代码的那个。这是你可以在这里进行的唯一真正的优化,也可能在数百万其他地方。
答案 4 :(得分:1)
这看起来更简单:
if($_error==3)
do stuff;
else if($_error>0)
do some other stuff
else
do normal stuff
没有人注意到你可能赢得的微秒。
答案 5 :(得分:1)
逻辑上以下是相同的(请原谅我的伪代码)
(! expression_one || ! expression_two) /** this is the same as the one below **/
! (expression_one && expression_two)
功能上哪一个更优化?它们都是最佳的。如果第一个表达式为真(在||情况下)或为假(在&& case中)
,则两种方式(&&和||)都允许短路答案 6 :(得分:1)
答案 7 :(得分:0)
(A || B)=!(A&& B)。所以它确实没有什么区别
编辑:(A || B)=!(A&& B)错误。请评论。正确的形式是(!A ||!B)=!(A&& B)。
道歉
答案 8 :(得分:0)
表现明智我认为它们非常相似(见wvanbergen的帖子),但行为上有明显的差异。我认为你目前的帖子可能没有做你想要的。在$ _error = 3的第一行中,你将有$ no_errors = false。当您检查两个条件时,两个条件都需要满足,并且更合适。
有时候我发现检查逻辑的最简单方法就是实际说出我想要的内容。例如,“如果错误代码不 0 3,则我们没有错误
我通常发现在这种情况下只有几个变量,我用英语写句子的方式为我提供了最直观(和准确)的方法来确定逻辑运算符。
如果您发现此过程后代码看起来很混乱,那么您可能会发现有关De Morgan法律的this链接很有用
答案 9 :(得分:0)
如果您使用:
$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;
这意味着如果$ error!= 0 AND $ error!= 3这是无效的逻辑,因为$ error不能==到3和0它可以是3或0但不能同时两者。
在上面的例子中,如果$ error = 0,那么它将评估为FALSE,因为它不是3&& 0你正在寻找3 || 0