2009-01-19 185 views
0

对不起,如果这是一个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和OR是否相同,或者是逻辑上或功能上更优化的?

+0

不要询问有关开发的基本面道歉,甚至在节目20yrs我经常写微基准测试和测试应用程序,以证明根本的东西。证明你的假设是掌握你的交易的一个重要方面。 – TravisO 2009-01-19 18:50:23

+0

三元编程导致可读性差,我总是避免它。 – TravisO 2009-01-19 18:50:57

回答

1

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

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

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

2

从表现上看,请记住,评估在大多数语言中都是懒惰的。使用OR,如果第一个条件为真,它将返回true而不评估第二个条件。对于AND,如果第一个条件是假的,它将返回false,而不评估第二个条件。

否则,运营商本身的表现并没有真正的不同。使用你最可读的内容。

0

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

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

我道歉

+0

嘿,事实并非如此。德·摩根定律:==(A && B) – 2009-01-19 11:38:02

1

最好是一个可以帮助你阅读代码快。这是您可以在这里做出的唯一真正的优化,并且可能在数百万其他地方。

1

这看起来更简单阅读:

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

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

4

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

至于逻辑运算符,并没有真正被认为是“良好实践”的东西。使用你想要的。如果你有麻烦搞清楚时,你的表情是真/假,请尝试真值表:http://en.wikipedia.org/wiki/Truth_table

20

,如果你使用switch语句这将是更可读:

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

在性能方面,我相信他们都非常相似(见职位由wvanbergen),但是在行为上存在明显的差异。我认为你目前的发帖可能没有做你想做的事。在第一行,如果你$ _error = 3,那么你将有$ no_errors = false。当你检查两个条件都需要满足时,也许会更合适。

有时候我发现要检查我的逻辑是居然说我想要什么响亮的最简单方法。例如,“我们没有任何错误,如果错误代码是不和 3”

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

如果您发现该代码看起来杂乱无章后这个过程,然后如果你用你可能会发现有用的

0

德摩根定律this链接:

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

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

1
  1. 就我个人而言,我会消除这些数字的使用和使用常量。除了易于维护之外,它们还使编码本身变得更加容易,并允许您明天更新值,例如如果某些情况下foreces您从3更改号码,你必须非常通过所有的代码
  2. 看起来正如gkrogers建议,开关 而完成同样的事情 更容易阅读和维护