2013-10-11 37 views
1

在練習期間,我將while循環與if/else子句組合在一起,因此決定將if/else轉換爲使用switch語句,以便挑戰我的想法。比較等效if/else和開關循環

該方案很簡單:有兩名球員必須贏得連續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>"; 
?> 

回答

1

這是給你的,無論是你更具可讀性。對我來說,第一個更清潔。

但在你的榜樣的作用是不一樣的: 而不是switch(true)您檢查$playerA && $playerB這意味着如果$playerA$playerB是0,這是假的,首先執行的情況。

+0

感謝您的回答:)我是用前開關(真),但後來我在什麼地方讀到它可以被認爲是對switch語句的濫用。但是,如果&&按照您的說法工作,那麼爲什麼我在執行代碼時得到A或B來贏得某些東西?我不應該總是得到一對配對嗎? – frafor

+0

A && B得到evalueted爲真,所以(如果A!= 0且B!= 0)它與開關(真)相同。在案件中使用表達通常可以稱爲「濫用」。 – schokocappucino

+0

是的,但是如果A和B都是!= 0,這意味着它們都是1,因爲rand(0,1)。那麼爲什麼我不總是一對一的情況下,執行該代碼? – frafor

-1

基本上,使用開關比「long if」要好得多。第二個代碼會被認爲更有禮貌,但在代碼方面,它是相同的。

+0

他的開關不等價於if/else – kero

0

if/else或switch將成爲性能困境的源頭是極其不可能的。如果您遇到性能問題 ,則應首先執行性能分析分析,以確定慢點所在的位置爲 。不成熟的優化是所有邪惡的根源!

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

開關可能(取決於implementatin)使用跳轉表(在c和 C++),所以在一定條件下它可能是更好的性能。 一般來說,它表示你的意圖更清晰,因此編譯器可以假裝 它很聰明。

考慮,如果在你的例子甚至不使用其他如鏈,它 品牌切換得更快(因爲沒有評估所有條件) ,也可以改變你的代碼的含義

If vs. Switch Speed

if-switch-performance 因此,贊成這個例子,如果更好。

0

你應該使用開關,大部分時間用於可讀性和可伸縮性問題,基本上所有你可以用開關做的事情,你也可以做,否則如果阻止。

但在你的例子中,因爲你在switch兩個變量(player A和player B)中測試,switch語句不會給你的代碼更好的可讀性。我的選擇是其他如果阻止。

也很好記住,好當你想同一個變量與另一個值幾次比較使用開關:

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

你可以看到一個比較三次。

我希望我澄清你的問題。

0

鑑於switch/case總是可以用if/else構造重現,所以當它發光時應該使用它。當開關部分具有固定值或表達式的結果時,它會更清晰,然後您檢查該值所代表的是哪個「大小寫」。

例如

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

沒有人阻止你以另一種方式使用它們,但我認爲這是一個良好的編碼風格