Подтвердить что ты не робот

Должен ли я когда-либо использовать продолжение внутри оператора switch?

Я заметил, что вы действительно можете использовать ключевое слово continue в инструкции switch, но на PHP он не делает того, что я ожидал.

Если он терпит неудачу с PHP, кто знает, сколько других языков он терпит неудачу? Если я много переключаюсь между языками, это может быть проблемой, если код не ведет себя так, как я ожидаю, что он будет вести себя.

Должен ли я просто избегать использования continue в инструкции switch??

Ошибка 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
*/

С++ работает как ожидалось (переход к концу цикла 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
*/
4b9b3361

Ответ 1

К сожалению, continue и break используются при switch при использовании switch.

Не позволяйте PHP разрушать ваши впечатления на других языках и продолжайте использовать continue, где вам это нужно!

Ответ 2

Попробуйте использовать continue 2, чтобы продолжить следующую итерацию цикла, окружающего оператор switch.

EDIT:

    $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!

Ответ 3

Документация для инструкции PHP continue дает следующее:

Примечание: Обратите внимание, что в PHP оператор switch считается структурой цикла для continue.

Вы должны знать, что разные языки дают одни и те же ключевые слова тонко разные значения и не предполагают, что PHP continue ведет себя так же, как С++ continue.

Если continue имеет смысл в PHP switch, где он не будет работать на С++, используйте его.

Если continue имеет смысл в С++ switch, где он не будет работать в PHP, используйте его.

Ответ 4

Использование продолжения внутри конструкции С++ switch / case, встроенной в цикл, отлично. Вы не должны ограничивать свой стиль на С++ только из-за неправильного поведения, происходящего на других языках программирования.

Ответ 5

В C и С++ оператор switch представляет собой лишь причудливую комбинацию if/else if и меток /goto, поэтому использование continue внутри switch в порядке. Но, как вы заметили, он не делает то, что вы ожидаете от него, на других языках, похожих на C или С++. Это потому, что они похожи только на синтаксис, для семантических правил они очень разные звери. Так что вещь, которая работает на одном языке, определенно не будет работать в другом, даже если языки выглядят одинаково.

Ответ 6

Важно отметить, что continue и break не ведут себя одинаково, если оператор switch вложен в цикл. Если вы используете оператор switch для оценки чего-либо и хотите перейти к следующему элементу цикла, если условие выполнено, вы должны использовать continue 2. Использование break 2 в этом случае вырвется из всего цикла for, что может не быть желаемым действием.

Ответ 7

Как указано в Руководство PHP:

"Обратите внимание, что в PHP оператор switch считается структурой циклов для продолжения."

Таким образом, использование continue выйдет из оператора switch, а не цикла for. Опасности принятия аналогичного синтаксиса на разных языках.