web-dev-qa-db-ja.com

switchステートメント内でcontinueを使用する必要がありますか?

実際にswitchステートメントでcontinueキーワードを使用できることに気づきましたが、PHPでは、期待どおりに動作しません。

PHPで失敗した場合、失敗した他の言語の数を知っているのは誰ですか?言語を頻繁に切り替える場合、コードが期待どおりに動作しない場合、これは問題になる可能性があります。

その場合、switchステートメントでcontinueを使用しないでください。

PHP(5.2.17)は失敗します:

for($p = 0; $p < 8; $p++){
    switch($p){
        case 5:
            print"($p)";
            continue;
            print"*"; // just for testing...
        break;
        case 6:
            print"($p)";
            continue;
            print"*";
        break;
    }
    print"$p\r\n";
}
/*
Output:
0
1
2
3
4
(5)5
(6)6
7
*/

C++は期待どおりに動作するようです(forループの終わりにジャンプします)。

for(int p = 0; p < 8; p++){
    switch(p){
        case 5:
            cout << "(" << p << ")";
            continue;
            cout << "*"; // just for testing...
        break;
        case 6:
            cout << "(" << p << ")";
            continue;
            cout << "*";
        break;
    }
    cout << p << "\r\n";
}
/*
Output:
0
1
2
3
4
(5)(6)7
*/
37
Rookie

残念ながら、continueステートメントを使用する場合、breakPHPswitchでも同じです。

PHPを他の言語での体験を台無しにせず、必要な場所でcontinueを使い続けてください。

40
Aesthete

continue 2を使用して、switchステートメントを囲むループの次の反復に進みます。

編集:

    $foo = 'Hello';

    for ($p = 0; $p < 8; $p++) {
         switch($p) {
             case 3:
                 if ($foo === 'Hello') {
                     echo $foo;
                     break;
                 } else {
                      continue 2;
                 }

             default:
                 echo "Sleeping...<br>";
                 continue 2;

         }

         echo "World!";
         break;
    }

//This will print: Sleeping... Sleeping... Sleeping... Hello World!

72
Liam

PHP continueステートメント のドキュメントはこれを明確にします:

注:PHPでは、switchステートメントは続行

異なる言語が同じキーワードを微妙に異なる意味を与えることを知っているべきであり、PHP continueがC++ continueと同じように動作することを前提としないでください。

C++では機能しないPHP continueswitchが意味をなす場合は、それを使用してください。

PHPで機能しないC++ continueswitchが意味をなす場合は、それを使用してください。

7
user743382

PHPマニュアル で警告されているように:

「PHPでは、switchステートメントは続行するためのループ構造と見なされます。」

したがって、continueを使用すると、forループではなく、switchステートメントから抜け出します。言語間で同様の構文を想定することの危険性。

continueステートメントがループ内にネストされている場合、breakswitchは同じように動作しないことに注意することが重要です。 switchステートメントを使用して何かを評価し、条件が満たされた場合にループ内の次の項目に移動する場合は、continue 2を使用する必要があります。この場合にbreak 2を使用すると、forループ全体から抜け出します。これは、望ましいアクションではない可能性があります。

1
ZeLoubs

C++内で続行を使用するswitch / caseループに埋め込まれた構造は完全に問題ありません。他のプログラミング言語で発生する誤動作のために、C++でスタイルを制限するべきではありません。

0

CおよびC++では、switchステートメントはif/else ifとlabels/gotoの洗練された組み合わせにすぎないため、continue内でswitchを使用するのははい。しかし、お気づきのように、CまたはC++に対してsimilarである他の言語では、期待どおりに動作しません。それは、構文に関してのみ似ているためです。意味論的なルールの場合、それらは非常に異なる野獣です。したがって、1つの言語で機能するものは、言語が似ていても、他の言語ではほとんど機能しません。