C - Tricky Switch Case работает ..! - PullRequest
2 голосов
/ 25 апреля 2011

Народ,

Недавно начал изучать C.
Застрял в точке. Речь идет о работе оператора switch-case.

Вот код:

#include<stdio.h>

int main() {
        int i=4;
        switch(i) {

                default :       
                        printf("%s","Default");
                case 0:         
                        printf("%s","Case 0");
                case 1:         
                        printf("%s","Case 1");
                case 2:         
                        printf("%s","Case 2");

        return 0;
        }
 }  

Лично я считаю, что "Default" должно быть напечатано, поскольку оно не соответствует ни одному из значений регистра.
Но когда я запускаю код в Turbo C, я заметил следующее:

Default
Case 0
Case 1
Case 2  

Даже то же самое наблюдалось здесь: http://www.ideone.com/pFh1d

В чем проблема? Это проблема компилятора или какая-то ошибка в моем коде?


РЕДАКТИРОВАТЬ:

PS: Что не так, если вообще нужно сначала написать регистр по умолчанию. Любой вред?

Но как только компилятор узнает, что он должен выполнить оператор по умолчанию, зачем нам ставить оператор break после операторов по умолчанию?

Ответы [ 5 ]

7 голосов
/ 25 апреля 2011

Оператор switch перейдет к соответствующему case или default, а затем код продолжится до следующего break оператора.

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

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

Изменить следующим образом.

        int i=4;
        switch(i) {

                default :       
                        printf("%s","Default");
                        break;
                case 0:         
                        printf("%s","Case 0");
                        break;
                case 1:         
                        printf("%s","Case 1");
                        break;
                case 2:         
                        printf("%s","Case 2");
                        break;

        }
        return 0;
2 голосов
/ 25 апреля 2011

Но как только компилятор узнает, что он должен выполнить оператор по умолчанию, зачем нам ставить оператор break после операторов по умолчанию?

Потому что так работает язык.Стандарт языка гласит, что выполнение должно продолжаться с соответствующей метки регистра.Вы можете спросить, почему компилятор не добавляет операторы break автоматически после каждого case.Ну, если бы это было так, мы не смогли бы сделать это:

switch(x){
case 1:
case 2:
case 3:
 // do something
 break;
case 4:
 // do something else
 break;
default:;
}

Если бы компилятор добавлял break после каждого случая, нам пришлось бы переписать приведенный выше код следующим образом:

  switch(x){
case 1:
 // do something
case 2:
 // do the same thing
case 3:
 // do the same thing
case 4:
 // do something else
default:
}
1 голос
/ 02 июня 2016

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

1 голос
/ 25 апреля 2011

Тело оператора switch на языке C: один непрерывный составной оператор с несколькими точками входа.Каждая метка case/default является точкой входа .Вы можете ввести этот составной оператор в любой точке входа, и он будет продолжать выполняться до конца (если, конечно, не вмешается другой оператор перехода).Другими словами, case метки в switch работают так же, как goto метки.В этом отношении метка default ничем не отличается от меток case.

Это именно то, что вы наблюдаете в своем эксперименте.Выражение в вашем switch выглядит следующим образом

{
  printf("%s","Default");
  printf("%s","Case 0");
  printf("%s","Case 1");
  printf("%s","Case 2");
  return 0;
}

Вы вводите это утверждение через ярлык default: в самом начале.Так как вы не изменяете поток управления после входа в тело вашего switch (кроме, возможно, неуместного финала return), все четыре printf s изменяются на "огонь".

Смысл вашего вопроса, который начинается с "Но как только компилятор узнает, что он должен выполнить оператор по умолчанию ...", мне неясен.Функциональность конструкции switch/case в C такая же, как я описал выше.Вот что "знает компилятор".С другой стороны, вы, похоже, следуете каким-то совершенно необоснованным заблуждениям, придуманным самим собой, о том, что делает switch/case, и по какой-то причине ожидаете, что компилятор будет следовать тем же заблуждениям.Я бы сказал, что вам нужно прочитать книгу об основах языка Си, а не пытаться угадать, что делают различные языковые элементы.

Нет ничего плохого в том, чтобы сначала сделать случай default.Учитывая то, что я сказал выше, в некоторых ситуациях порядок меток внутри оператора имеет значение .Когда это имеет значение, вы должны организовать их в соответствии с вашими намерениями.Если вам нужен ваш default чехол первым, сделайте его первым.Если вам это не нужно (или это не имеет никакого значения), вы можете поместить его в последнюю очередь или куда угодно, где хотите.

1 голос
/ 25 апреля 2011

Соответствует defaule, так что Default, а затем из-за отсутствия break; все дела выполнены

сделайте так, чтобы получить ожидаемый результат

 default :       
                        printf("%s","Default"); break;
                case 0:         
                        printf("%s","Case 0");break;
                case 1:         
                        printf("%s","Case 1");break;
                case 2:         
                        printf("%s","Case 2");break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...