比较等效的if / else和switch循环

时间:2013-10-11 11:49:17

标签: php if-statement switch-statement

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

程序很简单:有两名球员必须赢得连续3场比赛才能停止比赛。玩家值在0和1之间随机排序,并且对匹配有一个上限,只是在随机性将赢得比赛的情况下:)

我想了解哪一个是最佳解决方案,以及为什么,因为对我而言,交换机版本似乎需要更少的代码行!

<?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>";
?>

5 个答案:

答案 0 :(得分:1)

取决于你,取决于你的可读性。对我来说,第一个更干净。

但在你的例子中,函数不一样: 您switch(true)代替$playerA && $playerB而不是$playerA,这意味着如果$playerB或{{1}}为0,则会执行第一个为false的案例。

答案 1 :(得分:0)

  

if / else或者切换的可能性极小   你的表现困境的根源。如果你有表现   问题,您应该首先进行性能分析分析   确定慢点的位置。过早优化是根本   所有的邪恶!

参考:What is the relative performance difference of if/else versus switch statement in Java?

  

切换可以(取决于执行)使用跳转表(在c和   c ++),所以在某些条件下它可能更高效。   通常,它表明您的意图更清晰,因此编译器可以假装   这很聪明。

     

考虑在你的例子中是否甚至不使用其他链,它   使开关更快(因为没有评估所有条件)   并且可能会改变代码的含义

If vs. Switch Speed

if-switch-performance 因此,如果更好的话,请考虑这个例子。

答案 2 :(得分:0)

你应该使用开关,大部分时间都是为了可读性和可扩展性问题,基本上所有你可以用开关做的事情,如果阻止你也可以做其他事情。

但是在你的例子中,因为你在switch 2中测试变量(播放器A和播放器B),所以switch语句不会给你的代码提供更好的可读性。如果阻止我的选择是否为else。

同样值得记住的是,当你想要将同一个变量与其他值进行多次比较时,使用开关是好的

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

你可以看到a被比较了三次。

我希望我澄清你的问题。

答案 3 :(得分:0)

鉴于switch / case总是可以使用if / else结构重现,你应该在它闪耀时使用它。当开关部分具有固定值或表达式的结果然后检查该值表示的“大小写”时,它会更清楚。

e.g。

$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中使用相同的模式。

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

答案 4 :(得分:-1)

基本上,使用开关比使用“long if”更好。第二个代码将被认为更有礼貌,但就代码而言,它是完全相同的。