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?)
}

break各case式が一致した後に使用しない場合、ほとんどのプログラミング言語は各ステートメントを実行し続けることを私は知っています。しかし、ほとんどの言語がこの2番目と3番目のcaseステートメントで成功した一致としてcaseブロックを実行する理由について私は混乱しています。

明確にするために:私はswitchステートメントの動作を知っていますが、一致が見つからない場合でも、caseブロック/ステートメントを成功した一致として実行することが理にかなっているという論理を理解していません。

更新:PHPだけでなく、ほとんどのプログラミング言語を反映するように質問を更新しました。

4

4 に答える 4

4

マニュアルから:

switchステートメントは、行ごとに(実際には、ステートメントごとに)実行されます。最初は、コードは実行されません。switch式の値と一致する値を持つcaseステートメントが見つかった場合にのみ、PHPはステートメントの実行を開始します。PHPは、switchブロックが終了するまで、または最初に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;
}
于 2013-03-05T01:47:22.233 に答える
3

そのようになっている理由は、おそらくPHPがCから構文を借用したためです。

ただし、元々この方法であった理由は、私が疑うコードの重複を減らすのに役立つからです。

あなたが好きなら:

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

スイッチがたどり着かなかった場合は、「SOUP」と「FRIES」が同じロジックを持つ4つのケースが必要になります。これがないと、スイッチをより適切に作成できます。

switch($item){
    case 'SOUP':
    case 'FRIES':
        eat($item);
        break;
    case 'JUICE':
        drink($item);
        break;
    default:
        use($item);
        break;
}
于 2013-03-05T02:07:03.303 に答える
2

各ケースの後にbreakを使用しない場合、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、Pascalなどのほとんどのプログラミング言語と同じであることに注意してください。

于 2013-03-05T01:47:25.850 に答える
0

一致するものが見つからない場合でも、switchステートメントがcaseブロックを実行するのはなぜですか?

を使用しない場合はbreak、すべてのスイッチが実行されるため、役立つ場合があります。例えば:

switch ( count ) {
      default : puts ( " ++++.....+++ " ) ;
      case 4: puts ( " ++++ " ) ;
      case 3: puts ( " +++ " ) ;
      case 2: puts ( " ++ " ) ;
      case 1: puts ( " + " ) ;
      case 0:;
      }

したがって、カウントが3の場合、出力が得られます。

+++
++
+

2の場合、出力が得られます

++
+

10の場合、次のようになります。

++++.....+++ 
++++ 
+++ 
++ 
+ 

そのため、必要なものが見つかったら、スイッチで他のケースを実行したい場合があります。上記のコードのように。

もしそうなら、elseでこれを行うことができますが、それはもっと多くのタイピングになるでしょう。

于 2019-01-20T20:26:59.823 に答える