2016-04-27 9 views
4

я наткнулся на этот код, который работает, как ожидалось:автономный перерыв в распределительном заявление

switch (ev->deviceType) { 

    break; 

    case DEVICE_TS1E0: 
     //some code 
     break; 

    case DEVICE_TS1E3: 
     //some code 
     break; 

    default: 
     //some logging 
     break; 
} 

Теперь есть одинока break; в начале переключателя, который появляется не иметь никакого эффекта.

Есть ли в наличии какие-либо обстоятельства, в которых этот break;?

+6

Это выглядит как остальные бедного кода очистки ко мне ... –

+0

@JoachimPileborg это не ничего неожиданного делать. Даже если 'switch' находится в цикле, блуждающий' break' является NOP. –

ответ

4

TL; DR Это заявление break недействительным и мертвым кодом. Контроль там никогда не дойдет.

C11 стандарт имеет довольно хороший пример аналогичного случая, позвольте мне процитировать это прямо.

Из главы §6.8.4.2/7, (курсив мой )

Пример В фрагмента программы искусственного

switch (expr) 
{ 
    int i = 4; 
    f(i); 
case 0: 
    i = 17; 
    /* falls through into default code */ 
default: 
    printf("%d\n", i); 
} 

объект, чей идентификатор i существует с автоматической продолжительности хранения (внутри блока), но никогда не инициализирован, и, следовательно, если управляющее выражение имеет ненулевое значение, вызов printf будет доступ к неопределенному значению. Аналогично, вызов функции f невозможен.

+1

На самом деле я задаюсь вопросом, почему стандарт допускает что-либо еще, кроме объявлений переменных до первого случая. –

+1

@MichaelWalz Это та же ситуация, что и в 'if (foo) {return; } else {return; } return; ', есть мертвый код, но он должен быть действительным кодом. – fluter

+0

@fluter конечно, но стандарт может запретить такие конструкции, потому что _any_ заявления, отличные от деклараций до первого 'case', не будут иметь никакого эффекта. –

2

Это заявление, как и любые другие утверждения, которые не содержатся в пункте case в редакции switch, являются недостижимым кодом, также называемым «мертвым кодом». Это означает, что они все равно не будут работать. Не рекомендуется использовать их.

Смежные вопросы