1

在一次练习中,我将 while 循环与 if/else 子句结合起来,因此决定将 if/else 转换为使用 switch 语句,只是为了挑战我的想法。

程序很简单:有两名玩家必须连续赢得 3 场比赛才能停止比赛。球员值在 0 和 1 之间随机排序,配对比赛有一个上限,以防随机性赢得比赛:)

我想了解哪个是最好的解决方案,以及为什么,因为在我看来,switch 版本似乎只需要几行代码!

<?php
$playerA=0;
$playerB=0;
$winA=0;
$winB=0;
$pair=0;
    while ($winA<=2 && $winB<=2 && $pair<=15) {
        $playerA = rand(0,1);
        $playerB = rand(0,1);
            if ($playerA > $playerB) {
                    $winA ++;
                    $winB=0;
                    echo "<div>Player A Wins.</div>";
            } elseif ($playerA < $playerB) {
                    $winB ++;
                    $winA=0;
                    echo "<div>Player B Wins.</div>";
            } elseif ($playerA == $playerB) {
                    $pair ++;
                    $winA=0;
                    $winB=0;
                    echo "<div>Pair, play again!</div>";
            }

    }
    echo "<div>There is a total of {$pair} pair matches</div>"; 
?>

现在开关一...

<?php
$playerA=0;
$playerB=0;
$winA=0;
$winB=0;
$pair=0;
    while ($winA<=2 && $winB<=2 && $pair<=15) {
        $playerA = rand(0,1);
        $playerB = rand(0,1);
            switch ($playerA && $playerB): 
            //This is an error: it should have been switch(true)
                case ($playerA > $playerB):
                    $winA++;
                    $winB=0;
                    echo "<div>Player A Wins.</div>";
                    break;
                case ($playerA < $playerB):
                    $winB++;
                    $winA=0;
                    echo "<div>Player B Wins.</div>";
                    break;
                case ($playerA == $playerB):
                    $pair++;
                    $winA=0;
                    $winB=0;
                    echo "<div>Pair, Play again!</div>";
                    break;
            endswitch;

    }
    echo "<div>There is a total of {$pair} pair matches</div>";
?>
4

5 回答 5

1

这取决于您,以您更具可读性为准。对我来说,第一个更干净。

但是在您的示例中,函数不一样:不是switch(true)您检查$playerA && $playerB这意味着 if $playerAor $playerBis 0 第一个为 false 的情况被执行。

于 2013-10-11T11:52:47.400 回答
0

if/else 或 switch 极不可能成为性能问题的根源。如果您遇到性能问题,您应该首先进行性能分析分析以确定慢点在哪里。过早优化是万恶之源!

参考:Java 中 if/else 与 switch 语句的相对性能差异是什么?

Switch 可能(取决于实现)使用跳转表(在 c 和 c++ 中),因此在某些条件下它可能会更高效。通常,它更清楚地说明了您的意图,因此编译器可以假装它很聪明。

考虑到如果在您的示例中甚至不使用 else if 链,它会使 switch 更快(因为没有评估所有条件)并且还可能改变代码的含义

如果与开关速度

if-switch-performance 所以根据这个例子 if 更好。

于 2013-10-11T11:54:47.647 回答
0

你应该使用 switch,大部分时间都是为了可读性和可伸缩性问题,基本上你可以用 switch 做的所有事情,也可以用 else if 块做。

但是在您的示例中,因为您在 switch 两个变量(玩家 A 和玩家 B)中进行测试,所以 switch 语句不会使您的代码具有更好的可读性。我的选择是 else if 阻止。

也很高兴记住,当您想将同一个变量与另一个值进行多次比较时,最好使用 switch,例如

switch ($a) {
    case 0:
        echo "a = 0";
        break;
    case 1:
        echo "a = 1;
        break;
    case 2:
        echo "a = 2";
        break;
}

您可以看到 a 被比较了 3 次。

我希望我能澄清你的问题。

于 2013-10-11T12:01:14.937 回答
0

鉴于 switch/case 始终可以使用 if/else 构造重现,因此您应该在它发光时使用它。当 switch 部分具有固定值或表达式的结果时,会更清楚,然后您检查该值代表的“情况”。

例如

$year_born = 2000;
switch ($age = get_current_year() - 2000){
   case $age < 18:
      // do something
      break;
   case $age >= 18 && $age <=20:
      // do something
      break;
   case $age > 20:
      // do something
      break;
}

你可以用 if 重写它,但很明显你总是做一些与年龄的可能值相关的事情。我不希望在 if/else 中有同样的模式。

然而,没有人阻止你以其他方式使用它们,但我认为这是一种很好的编码风格

于 2013-10-11T12:14:19.057 回答
-1

从本质上讲,使用switch比“long if”要好得多。第二个代码会被认为更有礼貌,但就代码而言,它几乎是一样的。

于 2013-10-11T11:54:17.847 回答