Наличие метки регистра переключателя без значения - PullRequest
2 голосов
/ 21 апреля 2019

Я работал с оператором Switch, когда случайно написал следующий фрагмент кода (на gcc в C)

        int a = 2;
        switch(a)
        {
                default:
                        printf("Default\n");
                case 1:
                        printf("One\n");          
                case2 :
                        printf("Two\n");
        }

Вывод, который я получил:

По умолчанию

Один

Два

Я могу понять, как возник этот вывод, однако я не понимаю, почему это не выдает ошибку, я имею в виду, что я явно не 'нет метки регистра (в случае2), верно?Также я наблюдал тот же результат, если я, например, правильно указал «case2» как «casex».Принимая во внимание, что если я не добавлю метку в любом случае, она выдаст ошибку времени компиляции.

Любая помощь будет оценена, спасибо!

Ответы [ 3 ]

4 голосов
/ 21 апреля 2019

Я могу понять, как появился этот вывод, однако я не понимаю, почему это не выдает ошибку, я имею в виду, что у меня явно нет метки регистра (в случае2), верно?

Да, case2 : не является меткой case , но является действительной действительной обычной меткой.Любому утверждению может предшествовать такая метка.Поскольку вы используете GCC, вы можете включить опцию -Wall (или, в частности, -Wunused-label), и в этом случае GCC должна предупредить, что эта метка не используется (потому что она не является целью любого оператора goto).

Также я наблюдал тот же результат, если, например, я правильно указал "case2", как "casex".

Ну, конечно.casex : также является допустимым обычным ярлыком.

Принимая во внимание, что если я не помещу ярлык в любом случае, он выдаст ошибку времени компиляции.

Я полагаю, вы должныозначает, что вы оставляете двоеточие, но удаляете весь текст метки (case2 / casex).Это действительно даст неверный код.Однако, если вы удалили всю строку, то, конечно, все будет в порядке.

2 голосов
/ 21 апреля 2019

вы пропустили break, поэтому выполнение продолжается после каждого случая (но с! = 1 для этих 3 выходов)

note case2: считается меткой (для goto ), поэтому не является ошибкой

0 голосов
/ 21 апреля 2019

Что происходит здесь, вы попали на метку по умолчанию, и, поскольку у вас не было перерыва, вы выполнили все остальные дела.

...