2016-11-23 4 views
1
#include<bits/stdc++.h> 
using namespace std; 

void show(int errorCause) 
{ 
    switch(errorCause) 
    { 
     case 1: 
     { 
      cout<<"in 1\n"; 
      break; 
     } 

     case 2: break; 

     case 3: 
     { 
      cout<<"in 3\n"; 
      break; 

      case 4: 
      { 
       cout<<"in 4\n"; 
       case 5: cout<<"in 5\n"; 
        break; 
      } 
     } 
     break; 

     default: 
     { 
      cout<<"in deafult\n"; 
      break; 
     } 
    } 
    return; 
} 

int main() 
{ 
    show(5); 
    return 0; 
} 

Я использовал этот пример кода, и я не мог понять его flow.According мне должно соответствовать условию по умолчанию, как errorCause ничего не соответствует, но его выход:Как выполняется этот блок переключателей?

in 5 

I не понимаете, почему он не будет в состоянии по умолчанию?

Вот мои сборки детали окружающей среды:

компилятор: версия г ++ 4.8.4 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3)

система: Ubuntu 14,04 (64-разрядная версия)

+0

Отформатируйте код, пожалуйста ...Я, если бы представлял себе компилятор, отказался бы прочитать и разобрать этот код, из первых рук. –

+0

Отладчик идеален, когда вы пытаетесь понять поток кода - вы можете просто шагнуть по программе шаг за шагом. –

ответ

4

Вы передаете 5, почему оператор switch не переходит в «случай 5»?

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

+0

Вставные фигурные скобки могут быть правы, если OP знает, какие области используются для ... – LPs

+0

Конечно, но здесь они просто путают ... – Rene

+0

Дело в том, что если код был отформатирован правильно, вы увидите, что вызывает путаницу OP - некоторые операторы 'case' находятся внутри разных уровней фигурных скобок. Но это фактически разрешено. – axalis

1

Во-первых, не пишите такой код. < г >

Во-вторых, причиной того, что он получает case 5: просто, что есть case 5: в заявлении выключателя. Не имеет значения, что он вложен внутри двух уровней фигурных скобок; это всего лишь ярлык для кода, к которому нужно перейти. Это не должно быть на внешнем уровне оператора switch.

+0

Извините за код .. новый. – adarsh

0

Это потому, что оценка switch «расслаблена», поэтому фигурные скобки не имеют значения. Только case имеет значение, но вы можете прыгать прямо в середину области на case (или даже до середины цикла, см. Duff's device).

2

case/default этикетка для switch заявления может появиться в любом месте в пределах этого switch заявления, за исключением во вложенном switch заявления.

Известный пример такого использования является Duff's device для разворачивания петель:

void copy(unsigned char *to, const unsigned char *from, size_t count) 
{ 
    size_t n; 

    if (!count) 
     return; 

    n = (count + 7)/8; 
    switch (count % 8) { 
    case 0: 
     do { 
      *to++ = *from++; 
    case 1: 
      *to++ = *from++; 
    case 2: 
      *to++ = *from++; 
    case 3: 
      *to++ = *from++; 
    case 4: 
      *to++ = *from++; 
    case 5: 
      *to++ = *from++; 
    case 6: 
      *to++ = *from++; 
    case 7: 
      *to++ = *from++; 
    case 1: 
     } while (--n > 0); 
    } 
} 

(адаптировано из оригинала).

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

0

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

кейс 5: cout < < "in 5 \ n"; break;

если вы хотите получить выписку по умолчанию, то изменить основные функции, как показано ниже:

int main() 
{ 
    show(6); 
    return 0; 
} 

надеюсь, что это помогает.