Сомнения в использовании оператора switch в C - PullRequest
0 голосов
/ 15 марта 2011

У меня есть сомнения: почему я получаю выходные данные, когда i=3 и , когда i=7?

main()
{
  int i;
  scanf("%d",&i);
  switch(i)
  {
        case 3: printf("message3");
        default:
               if(i==4)
               printf("message4");
        case 2:printf("message2");
               break;
        case 1:printf("Message1");
  }
}

Ответы [ 5 ]

2 голосов
/ 15 марта 2011

@ Shubham.Пожалуйста, прости меня, если я повторяю то, что ты уже знаешь.И в некотором смысле я расширяю то, на что уже указал @Henk.

В операторе switch роль меток case и default заключается только в том, чтобы определить, с чего должно начинаться выполнение.После определения первой метки остальные метки не имеют значения.Казнь "провалилась".Поэтому мы должны использовать break для остановки и выхода из switch.

. В вашем коде, если i == 3, то case 3 - первая строка выполнения.Затем выполняются case 3, default и case 2, за которыми следует break.

Если i - любое значение, отличное от 3, то выполняется default, за которым следуют case 2 изатем выйдите из switch.Я не думаю, что когда-либо можно будет выполнить case 1 из-за расположения default.

2 голосов
/ 15 марта 2011

Ну,

i == 3 напечатает сообщение3 и сообщение2
я == 4 напечатает сообщение4 и сообщение2
каждое другое значение я буду печатать сообщение2

используйте break для прекращения обработки совпадения.

1 голос
/ 15 марта 2011

После case 3 нет break. Итак, switch проваливается и выполняет оператор default.

1 голос
/ 15 марта 2011

У вас нет break после случая 3 и default.

0 голосов
/ 15 марта 2011

Порядок случая default не определяет, когда этот случай будет выполнен. Регистр default выполняется, когда переменная-переключатель не соответствует ни одному из значений в выражении регистра.

Для кода выше значение

  • 1 напечатает «Сообщение 1» при выполнении кода, следующего за case 1
  • 2 напечатает «сообщение 2» при выполнении кода, следующего за case 2
  • 3 напечатает «message 3message2» при выполнении кода, следующего за падением case 3 и до default и падение до case 2
  • 4 напечатает «message 4message2» при выполнении кода после падения с default и на case 2
  • любое другое значение будет выводить «сообщение 2» при выполнении случая default и падение до case 2

Я иногда кодирую свои переключатели с настройками по умолчанию

switch (ch) {
  default: break; /* do nothing */
  case '.': ch = ','; break; /* swap commas */
  case ',': ch = '.'; break; /* and periods */
}
...