Г. Шилдт - С#4.0 Полное руководство (1160795), страница 24
Текст из файла (страница 24)
Напомним, что ветвь г(е Еап1г не является обязательной. Когда она не нужна, ее можно просто опустить. Переход последовательности операторов, связанных с одной ветвью саве, в следующую ветвь саве считается ошибкой, поскольку в С() должно непременно соблюдаться правило недопущения "провалов" в передаче управления ходом выполнения программы. Именно поэтому последовательность операторов в каждой ветви саве оператора вы1гсЬ оканчивается оператором Ьгеаи.
(Избежать подобных "провалов", можно также с помощью оператора безусловного перехода посо, рассматриваемого далее в этой главе, но для данной цели чаще применяется оператпр Ьгеа)г.) Когда 128 Часть!. Язык С() в последовательносги операторов отдельной ветви саяе встречается оператор Ьсеа)с, происходит выход не только из этой ветви, но из всего оператора ян1ссЬ, а выполнение программы возобновляется со следующего оператора, находящегося за пределами оператора яийссЬ. Последовательность операторов в ветви с(ел ап1С также должна быть лишена "провалов", поэтому она завершается, как правило, оператором Ьгеа)с.
Правило недопущения "провалов" относится к тем особенностям языка СФ, которыми он отличается от С, С н- и )ауа. В этих языках программирования одна ветвь саяе может переходить (т.е, "проваливаться" ) в другую. Данное правило установлено в СФ для ветвей саве по двум причинам. Во-первых, оно дает компилятору возможность свободно изменять порядок следования последовательностей операторов из ветвей саяе для целей оптимизации.
Такая реорганизация была бы невозможной, если бы одна ветвь саяе могла переходить в другую. И во-вторых, требование завершать каждую ветвь саяе явным образом исключает непроизвольные ошибки программирования, допускающие переход одной ветви саяе в другую. Несмотря на то что правило недопущения "провалов" не допускает переход одной ветви саяе в другую, в двух или более ветвях саяе все же разрешается ссылаться с помощью меток на одну и ту же кодовую последовательность, как показано в следующем примере программы.
Пример "проваливанин" пустых ветвей саяе. ояьпэ зуяпеао с1аяя Нтргусаяеясапра11 ( ясасьс чоьг) Маза() ( ьпг Гог(а=14 1 < 51 14а) ян1гсЬ(1) ( саве 1: саве 2: саяе 3: Сопяо1е.иг1ое11пе("1 равно 1, 2 или 3"); Ьхеак4 саяе 4: Сопяо1е.нг1геЫпе("1 равно 4"); Ьгеак1 ) Ниже приведен результат выполнения этой программы. 1 равно 1, 2 или 3 равно 1, 2 или 3 равно 1, 2 или 3 равно 4 Если значение переменной 1 в данном примере равно 1, 2 или 3, то выполняется первый оператор, содержащий вызов метода ИгзгеЬТпе ( ) . Такое расположение нескольких меток ветвей с аз е подряд не нарушает правило недопущения "провалов"; поскол ьку во всех этих ветвях используется одна и та же последовательность операторов.
Расположение нескольких меток ветвей саяе подряд зачастую применяется в том случае, если у нескольких ветвей имеется общий код. Благодаря этому исключается излишнее дублирование кодовых последовательностей. Глава 5. Управляющие операторы 129 Вложенные операторы зьвхйсЬ Один оператор знассЛ может быть частью последовательности операторов другого, внешнего оператора зилссЛ, И такой оператор зиассЛ называется вложенным. Константы выбора внутреннего и внешнего операторов зньгсЛ могут содержать общие значения, не вызывая никаких конфликтов. Например, следующий фрагмент кода является вполне допустимым. знаксЛ(сЛ() ( сазе 'л': сопзоге.хгьгеьгпе("эта ветвь л — часть "внешнего оператора зньгсЛ."); знггсЛ(сЛ2) ( сазе 'Л': Сопзоье.нгьвеЬьпе("Эта ветвь Л вЂ” часть "внутреннего оператора знггсЛ") Ьгеа)н сазе 'В': конец внутреннего оператора знтосЛ Ьгеа)м сазе 'В': Оператор цыкла аког Оператор Гог уже был представлен в главе 2, а здесь он рассматривается более подробно.
Вас должны приятно удивить эффективность и гибкость этого оператора. Прежде всего, обратимся к самым основным и традиционным формам оператора гог. Ниже приведена общая форма оператора гог для повторного выполнения единственного оператора. Гог(инициализация) условие; итерация) оператор; А вот как выглядит его форма для повторного выполнения кодового блока: Гог (инициализация) условие; итерация) ( последовательность операторов; ) где инициализация, как правило, представлена оператором присваивания, задающим первоначальное значение переменной, которая выполняет роль счетчика и управляет циклом; условие — это логическое выражение, определяющее необходимость повторения цикла; а итерация — выражение, определяющее величину, на которую должно изменяться значение переменной, управляющей циклом, при каждом повторе цикла. Обратите внимание на то, что эти три основные части оператора цикла аког должны быть разделены точкой с запятой.
Выполнение цикла гог будет продолжаться до тех пор, пока проверка условия дает истинный результат. Как только эта проверка даст ложный результат, цикл завершится, а выполнение программы будет продолжено с оператора, следующего после цикла Гог. Цикл гог может продолжаться как в положительном, так и в отрицательном направлении, изменяя значение переменной управления циклом на любую величину. В приведенном ниже примере программы выводятся числа', постепенно уменьшающиеся от 100 до -100 на величину 5. 130 Часть (. Язык С№ // Выполнение цикла Гог в отрицательном направлении.
азгпу Буятеш; с1аяя Вестгот ( ятат1с чо10 Маьп() ( тпт хг тот(х = 100; х > †1; х — = 5) Сопяо1е.нг1геЬ1пе(х)г ) ) В отношении циклов гот следует особо подчеркнуть, что условное выражение всегда проверяется в самом начале цикла. Это означает, что код в цикле может вообще не выполняться, если проверяемое условие с самого начала оказывается ложным.
Рассмотрим следующий пример. Гот(сопит=10; соцпт < 5; сопят++) х += сопят; // зтот оператор не будет выполняться Данный цикл вообще не будет выполняться, поскольку первоначальное значение переменной аоц па, которая им управляет, сразу же оказывается больше 5. Это означает, что условное выражение аоцпг < 5 оказывается ложным с самого начала, т.е. еще до выполнения первого шага цикла.
Оператор цикла 2ог — наиболее полезный для повторного выполнения операций известное число раз. В следующем примере программы используются два цикла тот для выявления простых чисел в пределах от 2 до 20. Если число оказывается непростым, то выводится наибольший его множитель. Выяснить, является ли число простым. Вали оно // непростое, вывести наибольший его множитель. цяьпч Буягеш) с1аяя Е1пг(ртгшея ( ятатта чо10 Ма1п() ( ьпт пцшг 1пг ьпт Гастот; Ьоо1 ьяртипе; Гог(пцш = 2; пцш < 20г пцш++) ( тяргтше = тгце; Гастог = 0; // Выяснить, делится ли значение переменной пцш нацело.
Гог(т=2; т <=- пцш/2; 1++) ( 11((пцш Ъ т) == 0) // Значение переменной пцш делитая нацело. // следовательно, зто непроатое чиало. 1ярг1ше = Га1яе; Гастог ) Гвава б. Управляющие операторы 131 15(1яргипе) Сопяо1е.иггсевьпе(оош + " — простое число."); е1яе .Сопво1е.Хггсе)дпе("Наибольший множитель числа " + пцш + " равен " + Гассет) 1 Ниже приведен результат выполнения этой программы. 2 — простое число 3 — простое число Наибольший множитель 5 — простое число Наибольший множитель 7 — простое число Наибольший множитель Наибольший множитель Наибольший множитель 11 — простое число Наибольший множитель 13 — простое число Наибольший множитель Наибольший множитель Наибольший множитель 17 — простое число Наибольший множитель 19 — простое число числа 4 равен 2 числа б равен 3 8 равен 4 9 равен 3 10 равен 5 числа числа числа числа 12 равен б 14 равен 7 15 равен 5 1б равен 8 числа числа числа числа 18 равен 9 Некоторые разновидности оператора цикла Еох Применение нескольких переменных управления циклом В операторе цикла гог разрешается использовать две или более переменных для управления циклом.
В этом случае операторы инициализации и инкремента камсдой переменной разделяются запятой. рассмотрим следующий пример программы. // Использовать запятые в операторе цикла бог. цвтп9 Буягеш( с1аяя Соева ( ясасьс тоге Маьп() ( тпг бог(1=0, 3=101 1 < 3( 1++, 3 †) Сопяо1е.нг1ге11пе("1 и 3: " т 1 + " " + 3)( ) ) Оператор цикла гог относится к самым универсальным операторам языка С)), поскольку он допускает самые разные варианты своего применения.
Некоторые разновидности оператора цикла гог рассматриваются ниже. 132 Часть 1. Язык С№ Выполнение этой программы дает следующий результат. 1 и 7: 0 10 1из:19 1из:28 из:37 1из:46 В данном примере запятыми разделяются два оператора инициализации и еще два итерационных выражения. Когда цикл начинается, инициализируются обе переменные, 1 и 7. Всякий раз, когда цикл повторяется, переменная 1 инкрементируется, а переменная 7 декрементируется. Применение нескольких переменных управления циклом нередко оказывается удобным, упрощая некоторые алгоритмы. Теоретически в операторе цикла бог может присутствовать любое количество операторов инициализации и итерации, но на практике цикл получается слишком громоздким, если применяется более двух подобных операторов.
Ниже приведен практический пример применения нескольких переменных управления циклом в операторе бог. В этом примере программы используются две переменные управления одним циклом бог для выявления наибольшего и наименьшего множителя целого числа (в данном случае — 100). Обратите особое внимание на условие окончания цикла. Оно опирается на обе переменные управления циклом.
Г/ Использовать запятые в операторе цикла Гог лля выявления наименьшего и наибольшего множителя числа. цв1пд Нувсешг с1авя Сопвпа ( воаоьс чо1С Нагл() ( 1пс 1, 7) ьпс яша11еяс, 1агчевс) 1пя пцш) пцш = 100) вша11евс = 1агдеяс = 1( бог(1=2, 1=пои/2( (1 <= поы2) в (1 >= 2)' 1++ 1 ) ( ьт((вша11евя == 1) я ((пцш Ъ 1) == О)) яша11еяв 18[(1агдево == 1) В ((пцш % 7) == О)) 1агчеяс = 1) сопяо1е.хгьсешпе("наибольший множитель: " + 1вгчеяс)) Сопво1е.нггсесгпе("Наименьший множитель: " + яшв11еяс)) ) ) Ниже приведен результат выполнения этой программы.