在练习中,我将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>";
?>
答案 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-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”更好。第二个代码将被认为更有礼貌,但就代码而言,它是完全相同的。