Я не нашел ответа на этот вопрос, почему продолжение в случае коммутатора влияет на l oop за пределами коммутатора, но разрыв не "ломает" l ​​oop? - PullRequest
1 голос
/ 23 апреля 2020

Вот код:

#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");
                break;
            }
        }
        printf ("This doesn't get printed by case 1\n");
    }

    return 0;
}

Каждый раз, когда я ставлю 1, этот printf не будет отображаться, но, кроме этого, он работает хорошо. Так как continue и break работают для switch внутри loop? Почему break не ломает l oop? Вместо этого это мешает следующим делам быть правильно? Но как насчет continue? Чтобы было ясно, я на самом деле спрашиваю, как это отличается и как они на самом деле работают. Примечание: я тоже сделал это в java (с затмением).

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

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;
}
1 голос
/ 23 апреля 2020

continue, в частности, означает, что обработка в текущем l oop пропускается, и начинается следующая итерация l oop (при условии, что условия для запуска l oop все еще стоят).

В вашем коде есть только один l oop.

...