Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 25
Текст из файла (страница 25)
1 равно нулю. 1 равно единице. 1 равно двум. 1 равно трем. 1 равно четырем. 1 равно или больше пяти. 1 равно или больше пяти. 1 равно или больше пяти. 1 равно или больше пяти. 1 равно или больше пяти. Как видите, иа каждом шаге цикла выполняются операторы, связанные с совпадающей константой выбора, в обход всех остальных операторов. Когда же значение перемениой 1 становится равным или больше пяти, то оио ие совпадает ии с одной из констант выбора, а следовательно, выполняются операторы из ветви <(егац1с.
В приведенном выше примере оператором зи№ссп управляла перемеииая 1 типа 1пс. Как поясиялось ранее, для управления оператором зигссЬ может быть использоваио вы- славе 5, упраеллющие операторы 123 ражение любого целочисленного типа, включая и сЬаг. Ниже приведен пример примене- ния выражения и констант выбора типа сЬаг в операторе зизссЬ. // Испольэовать элементы типа спаг для управления // оператором ви1ссп.
пвьпо Яузсели с1авз ЯигссЬВето2 ( всастс уо1с( На1п() ( спаг спт лог(оп='Л'т оп<= 'Е'т сп.н.) ви1ссЬ(СЬ) ( саве 'й'с Сопзо1е.иггсеньпе("сЬ ЬгеаКт сазе 'В': Сопзо1е.ИггпеЬ1пе("сп ЬгеаК; сазе 'С': Сопзо1е.ИгесеЬ1пе("с)т Ьгеа)с) саве 'Р': Сопво1е.иг1севгпе("сЬ Ьгеа)с; сазе 'Е': Сопзо1е.иг1сеЬ1па("сп Ьгеа)ст содержит а")) содержит В") содержит С")) содержит В") содержит Е") Вот какой результат дает выполнение этой программы: СЬ содержит Л сЬ содержит В сп содержит С сп содержит В сп содержит Е Обратите внимание в данном примере на отсутствие ветви с)егаи1Ь в операторе ви1ссь. Напомним, что ветвь с)егап1с не является обязательной. Когда она не нужна, ее можно просто опустить. Переход последовательности операторов, связанных с одной ветвью сазе, в следующую ветвь сазе считается ошибкой, поскольку в С(т должно непременно соблюдаться правило недопущения "провалов" в передаче управления ходом выполнения программы.
Именно поэтому последовательность операторов в каждой ветви сазе оператора виегсЬ оканчивается оператором Ьгеак. (Избежать подобных "провалов" можно также с помощью оператора безусловного перехода сосо, рассматриваемого далее в этой главе, но для данной цели чаще применяется оператор Ьгеак.) Когда в последовательности операторов отдельной ветви сазе встречается оператор ЬгеаК, происходит выход не только из этой ветви, но из всего оператора зи1ьсЬ, а выполнение программы возобновляется со следующего оператора, находящегося за пределами оператора ви1гсь.
Последовательность 124 часть (. язык Сз операторов в ветви с(еуап11 также должна быть лишена "провалов", поэтому она завершается, как правило, оператором )огеа)г. Правило недопущения "провалов" относится к тем особенностям языка С(г, которыми он отличается от С, С++ и Зава. В этих языках программирования одна ветвь саяе может переходить (т.е. "проваливаться") в другую.
Данное правило установлено в С() для ветвей саяе по двум причинам. Во-первых, оно дает компилятору возможность свободно изменять порядок следования последовательностей операторов из ветвей саяе для целей оптимизации. Такая реорганизация была бы невозможной, если бы одна ветвь саяе могла переходить в другую. И во-вторых, требование завершать каждую ветвь саяе явным образом исключает непроизвольные ошибки программирования, допускающие переход одной ветви саяе в другую. Несмотря на то что правило недопущения "провалов" не допускает переход одной ветви саяе в другую, в двух или более ветвях саяе все же разрешается ссылаться с помощью меток на одну и ту же кодовую последовательность, как показано в следующем примере программы. // Пример "проваливания" пустых ветвей саве.
овьпп Зувгет; с1авя Еиргусаяевсапга11 ( всагьс уо1к( Ма1п () ( 1пс 1; Гог(1=1; 1 < 54 1++) вн1ссп(1) ( саве 1: саве 2: саяе 3: Сопво1е.игьгецьпе("1 равно 1, 2 или 3"); ыеахп саве 4: Сопво1е.нг1гецьпе("1 равно 4"): ьгеахп Ниже приведен результат выполнения этой программы. 1 равно 1, 2 или 3 1 равно 1, 2 или 3 1 равно 1, 2 или 3 1 равно 4 Бели значение переменной 1 в данном примере равно 1, 2 или 3, то выполняется первый оператор, содержащий вызов метода Иг1гернпе () .
Такое расположение нескольких меток ветвей саяе подряд не нарушает правило недопущения "провалов", поскольку во всех этих ветвях используется одна и та же последовательность операторов. Расположение нескольких меток ветвей саяе подряд зачастую применяется в том случае, если у нескольких ветвей имеется общий код. Благодаря этому исключается излишнее дублирование кодовых последовательностей. Глаеа 5, Улраеллющие операторы 125 Вложенные операторы вой.~со Один оператор янггсЬ может быть частью последовательности операторов другого, внешнего оператора яы1гсЬ. И такой оператор янйссЬ называется вложенным.
Константы выбора внутреннего и внешнего операторов янгссЬ могут содержать общие значения, не вызывая никаких конфликтов. Например, следуюший фрагмент кода является вполне допустимым: янгссЬ (сЬ1) ( саяе 'А': Сопяо1е.ыгьсеьвпе("Эта ветвь А — часть " + "внешнего оператора ян1ссЬ. )' яньссЬ(сЬ2) ( саяе 'А': сопяо1е.мгьгеь1пе("эта ветвь А — часть " + "внутреннего оператора яньссЬ")т Ьгеакт саяе 'В': // ) // конец внутреннего оператора ян1гсЬ Ьгеант саяе 'В': // ... Оператор цикла йод Оператор гог уже был представлен в главе 2, а здесь он рассматривается более подробно. Вас должны приятно удивить эффективность и гибкость этого оператора. Прежде всего, обратимся к самым основным и традиционным формам оператора гог.
Ниже приведена общая форма оператора гог для повторного выполнения единственного оператора. Гсг(инициализация) условие; итерация) оператор; А вот как выглядит его форма для повторного выполнения кодового блока. Гог(инициализация) условие; итерация) ( послепонательность операторов; где инициализация, как правило, представлена оператором присваивания, задающим первоначальное значение переменной, которая выполняет роль счетчика и управляет циклом; условие — это логическое выражение, определяющее необходимость повторения цикла; а итерация — выражение, определяющее величину, на которую должно изменяться значение переменной, управляющей циклом, при каждом повторе цикла.
Обратите внимание на то, что зти три основные части оператора цикла лог должны быть разделены точкой с запятой. Выполнение цикла лог будет продолжаться до тех пор, пока проверка условия дает истинный результат. Как только эта проверка даст ложный результат, цикл завершится, а выполнение программы будет продолжено с оператора, следуюшего после цикла Гог. Цикл гог может продолжаться как в положительном, так и в отрицательном направлении, изменяя значение переменной управления циклом на любую величину. В приведенном ниже примере программы выводятся числа, постепенно уменьшающиеся от 100 до -100 на величину 5.
126 Часть ). Язык СЗ // Выполнение цикла Гог в отрицательном направлении. ияьпд Зуясепц с1аяя Вестгот ( ягаггс чогб иаьп() ( ьпс хь Гог(х = 100) х > -100) х -= 5) Сопяо1е.ыгтгеввпе(х) ) В отношении циклов гог следует особо подчеркнуть, что условное выражение всегда проверяется в самом начале цикла.
Это означает, что код в цикле может вообще ие выполияться, если проверяемое условие с самого начала оказывается ложным. Рассмотрим следующий пример: Рог(соипс=10) соипг < 5) соипс++) х += соипг) // этот оператор не будет выполняться Этот цикл вообще ие будет выполияться, поскольку первоначальное значение перемеииой соипс, которая им управляет, сразу же оказывается больше 5. Это означает, что условное выражение соипс < 5 оказывается ложным с самого начала, т.е. еще до выполнения первого шага цикла. Оператор цикла гог — наиболее полезный для повторного выполнения операций известное число раз.
В следующем примере программы используются два цикла гог для выявления простых чисел в пределах от 2 до 20. Если число оказывается непростым, то выводится наибольший его множитель. // Выяснить, является лн число простым. Если оно // непростое, вывести наибольший его мноямтель. иягпд зуягев) с1аяя Ггпбргьвея ( ясасгс чоки Маги() ( гпс пипи ьпс 1) гпс Гассог) Ьоо1 гярггве) Гог(пив = 2) пив < 20) пивьь) гярггве = Ггие) Гассог = О) // Выяснить, делится лн значение переменной // пив нацело. Гог(1=2; 1 < пив/2; 1++) ( 1Г((пив Ъ 1) == О) ( // Значение переменной пив делится нацело. // Следовательно, это непростое число.