2013-03-05 592 views
0
switch(1){ 
    case 1: print 1; // prints 1 (as expected) 
    case 2: print 2; // prints 2 (even though match is not equal?) 
    case 3: print 3; // prints 3 (even though match is not equal?) 
} 

我知道如果在每個case表達式匹配後不使用break,大多數編程語言會繼續執行每條語句。但我很困惑,爲什麼大多數語言在第二個和第三個case語句中執行一個case block成功匹配。爲什麼switch語句即使沒有找到匹配時也執行一個case塊?

只是爲了澄清: 我知道switch語句的行爲,但我不明白這樣的邏輯:即使沒有找到匹配,執行case block/statement作爲成功的匹配也是有意義的。

更新:我只是更新了問題,以反映大多數編程語言,而不僅僅是PHP。

+0

請注意,交換機是一種可以以多種方式使用的語句。它不只是替代許多其他的。 – hek2mgl 2013-03-05 02:03:26

回答

3

的原因那就是方式可能是因爲PHP借用了C的語法。然而,最初這種方式的原因是它有助於減少我懷疑的代碼重複。

如果你有一個,如果這樣的:

if($item == 'SOUP' || $item == 'FRIES'){ 
    eat($item); 
}elseif($item == 'JUICE'){ 
    drink($item); 
}else{ 
    use($item); 
} 

如果交換機永遠不會被通過,你將需要4例「湯」和「薯條」具有相同的邏輯,如果沒有這種可以使開關更好:

switch($item){ 
    case 'SOUP': 
    case 'FRIES': 
     eat($item); 
     break; 
    case 'JUICE': 
     drink($item); 
     break; 
    default: 
     use($item); 
     break; 
} 
+0

的例子很好的答案! +1 – hek2mgl 2013-03-05 02:08:20

+0

儘管如此,這並不是真正的爭論點。這是多個案例匹配的一個很好的例子,但可能有更好的方法來顯示應該運行多個匹配的代碼塊。 – JRoughan 2013-03-05 02:17:45

4

the manual

switch語句執行逐行(實際上是語句語句)。一開始,沒有代碼被執行。只有當找到一個與switch表達式的值匹配的case語句時,PHP纔會開始執行語句。 PHP繼續執行語句,直到切換塊結束,或者第一次看到break語句。如果您沒有在案例的聲明列表末尾寫入break語句,PHP將繼續執行以下案例的聲明。

switch(1){ 
    case 1: 
     echo 1; // echos 1 (as expected) 
     break; // stop!!! 
    case 2: 
     echo 2; // won't get here 
     break; 
    case 3: 
     echo 3; //or here 
     break; 
} 
1

我知道,PHP繼續檢查switch語句的情況下,如果你不每種情況下

好像你不明白使用後休息。您錯過使用break關鍵字:

switch(1){ 
    case 1: echo 1; break; 
    case 2: echo 2; break; 
    case 3: echo 3; break; 
} 

注意,一個case聲明就像是代碼的入口點。案例條件匹配後,代碼將遍歷所有案例,直至達到break

要將更新:請注意,這種行爲是PHP一樣的大多數編程語言包括:C,C++,Java和JavaScript中,ActionScript中,帕斯卡爾,....

+0

正確閱讀他們的問題。 – 2013-03-05 01:48:04

+0

@ jimjimmy1995'我知道PHP在繼續檢查switch語句的情況下,如果你沒有在每個case之後使用break,他真的知道嗎?你怎麼能降低這個答案!!? – hek2mgl 2013-03-05 01:50:21

+0

我沒有... o_O – 2013-03-05 01:53:33

相關問題