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 运算符可能会更好/更安全。但我思考得越多,我看到的差异就越小。

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

4

10 回答 10

21

如果您使用 switch 语句,它将更具可读性:

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}
于 2009-01-19T11:37:53.970 回答
5

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

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

于 2009-01-19T11:37:21.553 回答
2

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

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

于 2009-01-19T11:33:29.110 回答
1

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

于 2009-01-19T11:36:19.433 回答
1

这看起来更容易阅读:

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

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

于 2009-01-19T11:36:32.567 回答
1

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

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

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

于 2009-01-19T11:38:36.590 回答
1
  1. 就我个人而言,我会消除这些数字的使用,而是使用常量。除了更易于维护之外,它们还使编码本身变得更加容易,并允许您在明天更新值,例如,如果某些情况迫使您将数字从 3 更改,您必须仔细查看所有代码
  2. 正如 gkrogers 所建议的那样,在完成同样的事情时切换更容易阅读和维护
于 2009-01-19T12:39:57.260 回答
0

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

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

我很抱歉

于 2009-01-19T11:35:20.667 回答
0

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

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

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

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

于 2009-01-19T11:46:49.427 回答
0

如果您使用:

$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。

于 2009-01-19T12:33:49.363 回答