【问题标题】:Comparing equivalent if/else and switch loop比较等效的 if/else 和 switch 循环
【发布时间】:2013-10-11 11:49:17
【问题描述】:

在练习中,我将 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>";
?>

【问题讨论】:

    标签: php if-statement switch-statement


    【解决方案1】:

    这取决于您,以您更容易阅读为准。对我来说,第一个更干净。

    但在您的示例中,功能不一样: 而不是switch(true),而是检查$playerA &amp;&amp; $playerB,这意味着如果$playerA$playerB 为0,则执行第一个错误的情况。

    【讨论】:

    • 感谢您的回答 :) 我之前使用的是 switch(true),但后来我在某处读到它可以被认为是对 switch 语句的滥用。但是,如果 && 像你说的那样工作,那么为什么我在执行代码时让 A 或 B 赢得一些东西?我不应该总是得到一对匹配吗?
    • A && B 被评估为真,因此(如果 A != 0 和 B != 0)它与 switch(true) 相同。在 case 中使用表达式通常可以称为“误用”。
    • 是的,但是如果 A 和 B 都是 !=0 则意味着它们都是 1,因为 rand(0,1)。那么为什么我不总是得到一对案例来执行该代码?
    • A = 0B = 1 的情况下,您切换为 false (0 && 1 == false)。 ($playerA &gt; $playerB) == false 为真,玩家 A 获胜
    • OOOooooooWaaaaaaaaoooo... 我明白了! :)
    【解决方案2】:

    if/else 或 switch 不太可能成为 你的表现问题的根源。如果你有表现 问题,你应该先做一个性能分析分析 确定慢点在哪里。过早优化是根本 万恶之源!

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

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

    考虑到如果在你的例子中甚至没有使用 else if 链,它 使切换更快(因为没有评估所有条件) 也可能会改变代码的含义

    If vs. Switch Speed

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

    【讨论】:

      【解决方案3】:

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

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

      还需要记住,当您想将同一个变量与另一个值进行多次比较时,最好使用 switchlike

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

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

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

      【讨论】:

        【解决方案4】:

        鉴于 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 中出现相同的模式。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 他的开关不等同于 if/else
          猜你喜欢
          • 1970-01-01
          • 2020-10-15
          • 2015-07-20
          • 2016-11-30
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2016-08-07
          • 1970-01-01
          相关资源
          最近更新 更多