Groupby 8 страница.
Если конечная точка списка операторов в разделе switch достижима, распознается ошибка времени компиляции. Это так называемое правило «запрета последовательного выполнения». Следующий пример switch (i) { является допустимым, поскольку в нем нет разделов switch с достижимой конечной точкой. В отличие от языков C и C++, при выполнении раздела switch не допускается выход в следующий раздел switch, поэтому в примере switch (i) { возникает ошибка времени компиляции. Если после выполнения одного раздела switch должно следовать выполнение другого раздела switch, необходимо явным образом указывать оператор goto case или goto default: switch (i) { В разделе_switch разрешается использовать несколько меток. Следующий пример является допустимым: switch (i) { Здесь правило запрета последовательного выполнения не нарушается, поскольку метки case 2: и default: входят в один раздел_switch. Правило запрета последовательного выполнения позволяет избежать распространенных ошибок в программах C и C++, вызываемых случайным пропуском оператора break. Кроме того, благодаря этому правилу разделы switch оператора switch можно расставлять в произвольном порядке — это не повлияет на поведение оператора. Например, в вышеприведенном примере можно расположить разделы switch в обратном порядке, и это не отразится на выполнении оператора: switch (i) { Список операторов раздела switch обычно заканчивается оператором break, goto case или goto default, но в принципе допускается любая конструкция, исключающая достижимость конечной точки списка операторов. Например, оператор while, контролируемый логическим выражением true, никогда не позволит достичь его конечной точки. Аналогично операторы throw и return всегда передают управление в другое место, и их конечные точки также недостижимы. Поэтому следующий пример будет допустимым: switch (i) { Определяющим типом оператора switch может быть тип string. Например: void DoCommand(string command) { Подобно операторам проверки равенства строк (§7.9.7), оператор switch действует без учета регистра символов и сможет выполнить данный раздел switch только при условии, что строка switch-выражения в точности совпадает с константой метки case. Если определяющим типом оператора switch является string, в качестве константы метки case разрешается использовать значение null. Списки_операторов в блоке_switch могут включать операторы объявления (§8.5). Областью видимости локальной переменной или константы, объявленной в блоке switch, является этот блок switch. Значение имени, используемого в контексте выражения, должно быть одинаковым в пределах блока switch (§7.5.2.1). Список операторов в разделе switch считается достижимым, если оператор switch является достижимым и соблюдено по крайней мере одно из следующих условий. · Значение switch-выражения не является константой. · Значением switch-выражения является константа, совпадающая с одной из меток case в разделе switch. · Значением switch-выражения является константа, не совпадающая ни с одной из меток case, и в разделе switch имеется метка default. · На метку switch раздела switch указывает достижимый оператор goto case или goto default. Конечная точка оператора switch считается достижимой, если соблюдено по крайней мере одно из следующих условий. · Оператор switch содержит достижимый оператор break, осуществляющий выход из оператора switch. · Оператор switch является достижимым, значение switch-выражения не является константой и метка default отсутствует. · Оператор switch является достижимым, значением switch-выражения является константа, не совпадающая ни с одной из меток case, и метка default отсутствует. 8.8 Операторы итераций; Оператор итераций повторно выполняет один и тот же внедренный оператор. оператор_итераций: While Оператор while выполняет внедренный оператор несколько раз (возможно, ни разу) в зависимости от соблюдения условия. оператор_while: Оператор while выполняется следующим образом. · Вычисляется логическое_выражение (§7.19). · Если результатом логического выражения является true, управление передается внедренному оператору. Если управление достигает конечной точки внедренного оператора (возможно, в результате выполнения оператора continue), управление передается в начало оператора while. · Если значением логического выражения является false, управление передается в конечную точку оператора while. В операторе while внутри внедренного оператора можно использовать оператор break (§8.9.1) для передачи управления в конечную точку оператора while (т. е. для завершения итераций внедренного оператора), а также оператор continue (§8.9.2) для передачи управления в конечную точку внедренного оператора (для выполнения еще одной итерации оператора while). Внедренный оператор в операторе while считается достижимым, если оператор while является достижимым и значение логического выражения отлично от константы false. Конечная точка оператора while считается достижимой, если соблюдено по крайней мере одно из следующих условий. · Оператор while содержит достижимый оператор break, осуществляющий выход из оператора while. · Оператор while является достижимым и значение логического выражения отлично от константы true. Do Оператор do выполняет внедренный оператор один или несколько раз в зависимости от соблюдения условия.
|