Ответ 1
Не только он действителен, аналогичная структура была использована в реальном коде, например Duff Device, который представляет собой развернутый цикл для копирования буфер:
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch(count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n > 0);
}
}
Поскольку оператор switch
действительно просто вычисляет адрес и переходит к нему, легко понять, почему он может перекрываться с другими структурами управления; строки в других структурах управления также имеют адреса, которые могут быть также нацелены на достижение цели!
В представленном вами случае представьте, не было ли в вашем коде switch
или break
. Когда вы закончите выполнение then
части инструкции if
, вы просто продолжаете идти, поэтому вы попадаете в case 2:
. Теперь, поскольку у вас есть switch
и break
, важно, из чего может выйти break
. Согласно странице MSDN, "Операция C break" ,
Оператор break завершает выполнение ближайшего вложения do, для, или while, в котором он отображается. Элемент управления переходит к оператору, который следует за завершенным оператором.
Поскольку ближайший охватывающий do, для, переключатель или , а - ваш переключатель (обратите внимание, что , если не включен в этот список), тогда, если вы находитесь внутри блока then
, вы переходите к внешней стороне оператора switch
. Что еще более интересно, это то, что произойдет, если вы введете case 0
, но c == 'A'
- false. Затем if
передает управление сразу после закрывающей скобки блока then
, и вы начинаете выполнение кода в case 2
.