B (а затем и его потомки, включая C ++, Java или JavaScript) перегружают ключевое слово break
, чтобы выпрыгнуть из switch
es.
Так, когда вы находитесь во вложенном цикле / switch
, ключевое слово break
будет применяться к самым внутренним switch
или l oop, в зависимости от того, что ближе.
Эта перегрузка является случайностью истории. B начал с копирования BCPL, и в то время как BCPL позже получил ключевое слово endcase
специально для взлома switch
es, Томпсон и Ритч ie не знали об этом изменении, поэтому B и C остались с их самодельной реадаптацией break
для этой цели.
(http://port70.net/~nsz/c/c89/dmr_the_development_of_the_c_language.pdf
Не все различия между языком BCPL, описанным в книге Ричардса [Richards79], и В были намеренно, мы начали с более ранней версии BCPL [Richards 67]. Например, конечный регистр, который выходит из оператора switchon BCPL, не присутствовал в языке, когда мы изучали его в 1960-х годах, и поэтому перегрузка ключевого слова break в побег от оператора переключения B и C обязан дивергентной эволюции, а не сознательным изменениям.
)
В любом случае, в B / C / C ++, break
/ continue
- не что иное, как синтактика c сахар для goto
, и если вы хотите break
/ continue
что-то, кроме внутреннего цикла / switch
, вы всегда можете достичь этого с нами явное goto
:
#include <stdio.h>
int main ()
{
int menu=0;
while (menu!=3)
{
scanf ("%d", &menu);
switch (menu)
{
case 1:
{
printf ("Case 1\n");
continue;
}
case 2:
{
printf ("Case 2\n");
goto break_loop;
//`return 0;` would work too in this case
break; //would break out of the switch
}
}
printf ("This doesn't get printed by case 1\n");
}
break_loop:
return 0;
}