0

私は最近、比較をどのように処理するかについて議論を始めましたが、switchそれを解決するための支援が必要です。

私がそのようなものを書く場合switch

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

どのifステートメントに相当しますか?AまたはB

// A

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

// B

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

3 に答える 3

5

皆さんに、はっきりさせておきます。

と同等Bです。

それは「両方」ではなく、時には一方ではなく、時には他方であり、常にBです。ある可能性があることを示す結果が表示されることがある理由を理解するには、PHPで型強制がどのようAに機能するかを理解する必要があります。

の「引数」にfalseの値を渡し、sでswitchを使用してブール値を生成した場合、式が。と評価された場合にのみ一致します。caseFALSE


switch基本的には、渡された値(式の左側)とsの式(右側)の間で(の代わりに)大まかな比較を実行する巨大なif/ツリーです。elseif=====switchcase

これは、コードのバリエーションで非常にうまく証明できます。

$x = 0;

switch ($x) {
  case $x > -1: // This is TRUE, but 0 == FALSE so this won't match
    echo "case 1";
  case $x == -1: // This is FALSE, and 0 == FALSE so this will match
    echo "case 2";
}

そして、それを2つのif/elseifツリーに変換すると:

A

$x = 0;

if ($x > -1) {
  // It matches here
  echo "case 1";
} else if ($x == -1) {
  // and not here
  echo "case 2";
}

B

$x = 0;

if ($x == ($x > -1)) {
  // It doesn't match here
  echo "case 1";
} else if ($x == ($x == -1)) {
  // ..but here instead
  echo "case 2";
}
于 2012-08-10T15:33:45.327 に答える
2

That switch case is equivalent to B

Edit :

If we take for example that $x is equal to 0 :

$x > 5 will evaluate to false (and 0 evaluates to false too), so the first if will print bar, but the second one will print foo. The switch will be transformed to something like this :

switch ($x){
    case false:
        echo "foo";
        break;
    case true:
        echo "bar";
        break;
    default:
        echo "five";
        break;
}

and that will print foo (same as B)

Edit 2 :

I tried it so that gave me :

with $x = 0 => switch (foo), if A (bar), if B (foo)

with $x = 5 => switch (five), if A (five), if B (five)

with $x = 7 => switch (foo), if A (foo), if B (foo)

于 2012-08-10T15:29:23.910 に答える
2

あなたの例はBと同等です。

スイッチで比較を使用したい場合(そしてAと同等)、次のように書くことができます。

switch (true) { // Use true instead of $x
    case ($x > 5):
        echo "foo";
        break;
    case ($x < 5):
        echo "bar";
        break;
    default:
        echo "five";
        break;
}
于 2012-08-10T15:33:31.713 に答える