8

前に一致するケースがある場合、switch ステートメントのデフォルトは評価されますか?

元:

switch ($x) {
  case ($x > 5): print "foo";
  case ($x%2 == 0): print "bar";
  default: print "nope";
}

x = 50 の場合、fooand bar、 or fooand barand nope?

4

4 に答える 4

9

はい、「ブレーク」がない場合、最初にcase一致したアクションに続くすべてのアクションが実行されます。制御フローは、後続のすべての を「フォールスルー」し、ステートメントが検出されるまで、またはステートメントの最後に到達するまで、case後続の各 の下ですべてのアクションを実行します。casebreak;switch

あなたの例では、$x の値が 50 の場合、実際には が表示されます"nope"

は、キーワードに続く式とキーワードに続く各式とswitchの間で、実際には単純な等価性テストを実行していることに注意してください。switchcase

$x の値が 0 の場合にのみ表示されるという点で、あなたの例は珍しいものです"foo"(実際、$x の値が 0 の場合、「foo bar nope」と表示されます)。

キーワードに続く式caseが評価されます。この例では、0 (条件テストが false の場合) または 1 (条件テストが true の場合) を返します。switchと比較するのはその値 (0 または 1) です$x

于 2012-08-10T18:55:59.180 に答える
5

前に一致するケースがある場合、switch ステートメントのデフォルトは評価されますか?

多くの場合、そこに s があるため、ほとんどcaseの s ではそうすべきではありませんbreak。ただし、あなたの場合はdefault.

また、これらの単一行を実行しないようにしてください (読みやすくするため):

$x = 10;

switch (true) {
  case ($x > 5):
      print "foo";

  case ($x%2 == 0):
      print "bar";

  default:
      print "nope";
}

印刷しますfoobarnope。あなたの質問に答えるには:はい:-)

于 2012-08-10T14:50:39.830 に答える
2

自分で試してみた方が簡単だったでしょう。

いずれにせよ、ケースで break を使用しない場合は、それに続くすべてのケースが実行されます (デフォルトを含む)。

于 2012-08-10T14:51:21.073 に答える
2

それはスイッチの仕組みではありません。

マニュアルによると

switch ステートメントは、同じ式に対する一連の IF ステートメントに似ています。多くの場合、同じ変数 (または式) をさまざまな値と比較し、どの値に等しいかに応じて異なるコードを実行したい場合があります。これはまさに switch ステートメントの目的です。

みたいな評価

case ($x > 5):

単に等しい

case true:

また

case false:

$xなぜならの値に応じて、($x > 5)VALUEではなくEVALUATIONです。スイッチは、パラメータの値を比較して、それが のいずれかと等しいかどうかを確認します。case

switch($x) {
    case ($x > 5): // $x == ($x > 5)
        echo "foo";
        break;
    case ($x <= 5): // $x == ($x <= 5)
        echo "bar"
        break;
    default:
        echo "default";
        break;
}

上記のコードの比較は次と同等です

if ($x == ($x > 5)) {
    echo "foo";
} elseif ($x == ($x < 5)) {
    echo "bar";
} else {
    echo "five";
}

これは (いつ$x == 50) と同等です

if ($x == true) {
    echo "foo";
} elseif ($x == false) {
    echo "bar";
} else {
    echo "five";
}

これはと同等です

if (true) { // $x == true is the same as saying "$x is truthy"
    echo "foo";
} elseif (false) {
    echo "bar";
} else {
    echo "five";
}

ただし、 IFは、意図したとおりに switch ステートメントを使用しました (パラメーターを具体的な値と比較するため)。

switch ($x) {
    case 50:
        echo "foo ";
    case 30:
        echo "bar ";
    default:
        echo "foo-bar";
}

そして$x == 50、あなたの出力は

foo bar foo-bar

あなたのケースには何もないという事実のためにbreak

各ケースの末尾にキーワードを追加するbreakと、その特定のケースのコードのみが実行されます。

switch ($x) {
    case 50:
        echo "foo ";
        break;
    case 30:
        echo "bar ";
        break;
    default:
        echo "foo-bar";
        break;
}

出力:

foo 
于 2012-08-10T14:54:52.940 に答える