О случае переключения в C, почему он не распечатывается?

Возможный дубликат:
   Код перед первым «случаем» в switch-statement

У меня есть следующий код в C:

void isFindValue(int value1, int value2)
{
    switch (value1)
    {
    case 1:
      printf("value1 is found!\n");
      break;

    case 2:
      printf("value1 is found!\n");
      break;

    case 3:
      switch(value2)
      {
    printf("aaaaaaaaaaaaa\n");
     case 6:
         printf("bbbbbbbbbbbb\n");
         printf("value2 is found!\n");
         break;
      }
     default:
     break;    
}

если я вызываю функцию как isFindValue (3,6); printf из bbbbbbbbbbbbb , но aaaaaaaaaaaaa не знает, почему это произойдет? разве мы не должны делать что-то перед этим делом?

1
добавлено автор DCoder, источник

5 ответы

Потому что switch() работает с использованием меток. Он перескакивает на метку, на которой выполняется условие. Поэтому, когда вы достигаете

switch(value2) {
    printf("aaaaaaaaaaaaa\n");
    case 6:

поток управления немедленно переходит к метке case 6: , чтобы он пропускал вызов printf() .

Решение будет размещать его правильно, вне внутреннего переключателя:

case 3:
    printf("aaaaa\n");
    switch (value2) {

и т.п.

6
добавлено
Почему это дает аргумент против использования меток (и для этого операторов case-case), H2CO3?
добавлено автор Joost, источник
В то время как обсуждение v goto не имеет ничего общего с коммутационным корпусом. Вы говорите, что оператор switch должен быть вытащен, потому что есть доступная конструкция?
добавлено автор Joost, источник
Да, еще одна причина, почему этикетки следует избегать (или, по крайней мере, потреблять умеренно).
добавлено автор user529758, источник
@Joost Поскольку метки легко использовать (как в этом случае). Кроме того, как правило, метки не представляют собой хороший стиль, когда вы можете иметь хорошие структурированные операторы потока управления, такие как if или различные циклы. Рассмотрим точку обсуждения «в то время как против начала».
добавлено автор user529758, источник
@Joost Ну, это довольно радикально, но если вы так хотите, да.
добавлено автор user529758, источник

«aaaaaaaaaaaaa \ n» не печатается в любом случае . Ваш код не правильно структурирован.

Попробуйте переместить оператор из блока switch следующим образом:

printf("aaaaaaaaaaaaa\n");
switch(value2)
{
    case 6:
        printf("bbbbbbbbbbbb\n");
        printf("value2 is found!\n");
        break;
}
break;
0
добавлено

коммутатор всегда ищет case , и именно поэтому aaaaaaaaaaaa был пропущен. Он выполнит оператор связанного блока case .

0
добавлено

Вызов функции printf в инструкции:

printf("aaaaaaaaaaaaa\n");

не может быть достигнуто, потому что это до первого оператора case второго switch .

see Code before the first 'case' in a switch-statement

0
добавлено

«aaaaaaaaaaaaa» не появляется, потому что он неуместен (он не содержится в ярлыке, поэтому он недоступен). Вам нужно переместить его до второго оператора switch:

case 3:
    printf("aaaaaaaaaaaaa\n");
    switch(value2)
    {
       //body
    }
0
добавлено