logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.6.4.2 Оператор переключателя

Оператор переключателя вызывает передачу управления на один из

нескольких операторов в зависимости от значения выражения.

Выражение должно быть целочисленного типа или типа класса, для

которого существует однозначное преобразование к целочисленному

типу ($$R.12.3). Выполняются стандартные целочисленные преобразования.

Любой из операторов переключателя можно пометить одним или несколькими

префиксами, имеющими вид:

case выражение-константа :

Здесь выражение-константа ($$R.5.19) приводится к преобразованному

типу выражения переключателя. Никакие две константы из case одного

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

В переключателе может быть только один префикс вида

default:

Операторы переключателя могут быть вложенными, тогда метки из

case или default относятся к самому первому переключателю,

объемлющему их.

При выполнении оператора переключателя вычисляется выражение,

и его значение сравнивается с каждой из констант вариантов (case).

Если одна из этих констант равна значению выражения, то управление

передается в оператор, идущий за этой константой. Если ни одна из

констант не совпала со значением выражения, но есть префикс

default, то управление передается на оператор с этим префиксом.

Если префикса default нет, и совпадения не было, то не выполняется

ни один из операторов переключателя.

Если операторы, выполняемые в результате выбора, не приводят

к каким-либо передачам управления, то программа продолжает выполняться

"по меткам case и default" беспрепятственно. Выход из переключателя

возможен с помощью оператора break (см. $$R.6.6.1).

Обычно оператор, с которым имеет дело переключатель, бывает

составным. Описания могут появиться в операторах переключателя.

Однако переход ниже описания, в котором была явная или неявная

инициализация, считается незаконным, если только описание не

находится во внутреннем блоке, который обходится (т.е. полностью

обходится при передаче управления, $$R.6.7). Отсюда следует,

что описание с явной или неявной инициализацией должно содержаться

во внутреннем блоке.