2012-09-10 2 views
28

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

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

Должен ли я просто избегать использования 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(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 
*/ 
+0

конец петли? Я бы не стал вызывать оператор switch loop, это расширенный оператор if-else на мой взгляд - и вы вызываете continue в if-else? –

+0

Я не думаю, что это хорошая идея, чтобы попросить общий совет о конструкциях программирования, которые просто называются одинаковыми в разных langauges. Ищите советы для каждого отдельного языка. В конце концов, они разные, все с разными хорошими практиками. Поэтому мой совет будет состоять в том, чтобы использовать продолжение на тех языках, где он работает, и где он считается обычно хорошим делом. – PlasmaHH

+1

@ ZathrusWriter В вопросе говорится, что «конец цикла for», а не «конец цикла». Вопрос 'continue' в вопросе предназначен для перехода в конец цикла' for'. – hvd

ответ

32

К сожалению, continue и break одинаковы в PHP при использовании switch заявлений.

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

+0

Это очень странно, почему это одно и то же, что дублирует команды? – Rookie

+3

@Rookie В C++ 'continue' и' break' одинаковы в 'do {...} while (0)' loop тоже, но они различны в других контекстах. В PHP 'continue' и' break' одинаковы в инструкции 'switch', но в других контекстах они различны. – hvd

+1

Хорошо, как @TheForestAndTheTrees указали из руководства, коммутатор считается циклической структурой, и продолжение сделано для циклических структур. К сожалению, я никогда не видел петлю переключения, не так ли? – Aesthete

0

Как предупрежден в PHP Manual:

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

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

1

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

+0

'continue' может появляться только в итерации в C++. Пример в OP является только законным, потому что существует замкнутый цикл, включающий оператор switch. – jrok

+0

@jrok разъяснил, что, лучше сейчас? –

+0

Лучше на самом деле .. – jrok

8

The documentation for the PHP continue statement делает это ясно:

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

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

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

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

1

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

43

Попробуйте использовать 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!

+0

Я просто столкнулся с прецедентом для этого, где у меня есть петля для петли с переключателем внутри. Очень полезно! Синтаксис PHP break n/continue n сэкономил мне много усилий во многих сценариях. Если вы немного подробнее объясните этот ответ, я думаю, что это должен быть принятый ответ. – newms87

+0

Это супер захватывающий необязательный аргумент, о котором я никогда не знал. я чувствую, что только что начал изучать php снова – Thomas

+0

7 лет с PHP, и я все еще изучаю вещи из основ PHP! невероятно! большое спасибо! –

1

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

Смежные вопросы