Г. Шилдт - С#4.0 Полное руководство (1160795), страница 26
Текст из файла (страница 26)
В отличие от операторов цикла Гог и ы)111е, в которых условие проверялось в самом начале цикла, в операторе с(о-н)711е условие выполнения цикла проверяется в самом его конце. Это означает, что цикл с(о-ы)711е всегда выполняется хотя бы один раз. Ниже приведена общая форма оператора цикла г(о-н)111е. с(о ( операторы; ) нь11е (условие); При наличии лишь одного оператора фигурные скобки в данной форме записи необязательны. Тем не менее они зачастую используются для того, чтобы сделать кон- 2 в степени 0 2 в степени 1 2 в степени 2 2 в степени 3 2 в степени 4 2 в степени 5 2 в степени б 2 в степени 7 2 в степени 8 2 в степени 9 равно 1 равно 2 равно 4 равно 8 равно 16 равно 32 равно 64 равно 128 равно 256 равно 512 Глава 5.
Управляющие операторы 139 струкцию бо-ы)т11е более удобочитаемой и не путать ее с конструкцией цикла ып11е. Цикл с)о-и)г11е выполняется до тех пор, пока условное выражение истинно. В приведенном ниже примере программы цикл бо-ы)>11е используется для представления отдельных цифр целого числа в обратном порядке. Отобразить цифры целого числа в обратном порядке. цягпч зуясев; с1аяя РоИП11ерево ( ягаггс чогб нагл() ( 1пг псьи гпх пехдб191Г! пцв = 198; Сопяо1е.нггяеьгпе("Число: " + пцв); Сопяо1е.иггсе("Число в обратном порядке: с(о ( пехдбг91Г = пцв % 10г Сопяо1е.иггсе(пехсб191Г); пнв = пцв / 10г нд11е(пцв > 0)г Сопяо1е.иг1гедгпе()г Выполнение этой программы дает следующий результат. Число: 198 Число в обратном порядке: 891 Приведенный выше цикл действует следующим образом. На каждом его шаге крайняя слева цифра получается в результате расчета остатка от деления целого числа (значения переменной пцв) на 10.
Полученная в итоге цифра отображается. Далее значение переменной пцв делится на 10. А поскольку это целочисленное деление, то в его результате крайняя слева цифра отбрасывается. Этот процесс повторяется до тех пор, пока значение переменной пцв не достигнет нуля. Оператор цикла йохеасЬ Оператор цикла гогеасгг служит для циклического обращения к элементам коллекции, которая представляет собой группу объектов. В С)) определено несколько видов коллекций, к числу которых относится массив. Подробнее о цикле гогеас)г речь пойдет в главе 7, где рассматриваются массивы.
Применение оператора Ьгеа)с для выхода из цикла С помощью оператора )згеа)г можно специально организовать немедленный выход из цикла в обход любого кода, оставшегося в теле цикла, а также минуя проверку 3.40 Часть (. Язык С№ условия цикла. Когда в теле цикла встречается оператор ЬгеаК, цикл завершается, а выполнение программы возобновляется с оператора, следующего после этого цикла. Рассмотрим простой пример программы.
// Применить оператор ЬгеаК длл выхода ия цикла. цяьпс Буягеш( с1аяя ВгеаКоешо ( ясасьс чоьп' маьп() ( Использовать оператор ЪгеаК длл выхода ия этого цикла. Гог(ьпс 1=-10; 1 <= 10) 1++) ( 11(1 > О) ЬгевК; // завершить цикл, как только значение переменной 1 станет положительным Сопяо1е.иг1се(1 + " ") П Сопяо1е.нгьсевьпе("Готово!" )) Выполнение этой программы дает следующий результат. -10 -9 -8 -7 -б -5 -4 -3 -2 -1 0 Готово! Как видите, цикл гол организован для выполнения в пределах от -10 до 10, но, несмотря на это, оператор Ьгеак прерывает его раньше, когда значение переменной 1 становится положительным. Оператор Ь ге а К можно применять в любом цикле, предусмотренном в С((.
В качестве примера ниже приведена версия предыдущей программы, переделанная с целью использовать цикл с(о-хЬ11е. Применить оператор Ьгеах длл выхода ия цикла Оо-нШ1е. цяьпд Зуясеш) с1аяя ВгеаКПешо2 ( ясагьс чо1г( Ма1п() ( ьпг -10) по ( 11(1 > О) ЬгеаК/ Сопяо1е.ильге(1 + " "); 1+ю ) нб11е(1 <= 10); Сопво1е . Хгзге пыле ( "Готово! ") ) А теперь рассмотрим более практический пример применения оператора ЬгеаК.
В приведенной ниже программе выявляется наименьший множитель числа. Выявить наименьший множитель числа. ця1пч Бувбешг Глава б. Управляющие операторы 141 с1азз 81пбзша11езгуассог ( згасьс чо1б Ма1п () ( ьпз Гассог = 1; 1пс пцш = 10007 Гог(1пг =г; 1 <= пцшУ1Г 1+~) 11((пои%1) == 0) ( Гасгог = 17 Ьгеак; // прервать цикл, как только будет // выявлен наименьший множитель числа Сопзо1е.игьсещпе("Наименьший множитель равен " + Гассет); ) ) Результат выполнения этой программы выглядит следующим образом.
Наименьший множитель равен 2 Оператор Ь ге а Х прерывает выполнение цикла 1о г, как только будет выявлен наи- Ъ меныпий множитель числа. Благодаря такому применению оператора Ьгеа)< исключается опробование любых других значений после выявления наименьшего множителя числа, а следовательно, и неэффективное выполнение кода. Если оператор Ьгеак применяется в целом ряде вложенных циклов, то он прерывает выполнение только самого внутреннего цикла. В качестве примера рассмотрим следующую программу. // Применить оператор Ьгеай во вложенных циклах.
ЦЗГП9 ЯУЗГЕШ7 с1азз Вгеакиезсеб ( зсаг1с чогб Магп() ( Гог(1пс 1=0; 1<3; г++) ( сопзо1е.иг1геььпе("Подсчет во внешнем цикле: " ь г); Сопзо1е.нггсе(" Подсчет во внутреннем цикле: "); ьпг с = О; нь11е (Ь < 100) ( 11(г == 10) Ьгеа)ы !/ прервать цикл, если Г равно 10 Сопзо1е.игьсе(Г т " ") 7 Гь+7 Сопзо1е.иг1геЬ1пе()7 ) Сопво1е.иг1геЬгпе("циклы завершены."); ) Выполнение этой программы дает следующий результат. Подсчет во внешнем цикле: 0 Подсчет во внутреннем цикле; О 1 2 3 4 5 б 7 8 9 Подсчет во внешнем цикле: 1 142 Часть! Язык С№ Подсчет во внутреннем цикле: 0 1 2 3 4 5 б 7 8 9 Подсчет во внешнем цикле: 2 Подсчет во внутреннем цикле: 0 1 2 3 4 5 б 7 8 9 Циклы завершены Как видите, оператор Ьгеа)г из внутреннего цикла вызывает прерывание только этого цикла, а на выполнение внешнего цикла он не оказывает никакого влияния.
В о~ношении оператора Ьгеай необходимо также иметь в виду следующее. Вопервых, в теле цикле может присутствовать несколько операторов Ьгеа)с, но применять их следует очень аккуратно, поскольку чрезмерное количество операторов ь геах обычно приводит к нарушению нормальной структуры кода. И во-вторых, оператор ьгеа)с, выполняющий выход из оператора яыьссЬ, оказывает воздействие только на этот оператор, но не на объемлющие его циклы. Применение оператора аоп~~пие С помощью оператора сопс1пце можно организовать преждевременное завершение шага итерации цикла в обход обычной структуры уггравления циклом. Оператор с оп сьпце осуществляет принудительный переход к следующему шагу цикла, пропуская любой код, оставшийся невыполненным.
Таким образом, оператор сопгьпце служит своего рода дополнением оператора Ьгеа)с. В приведенном ниже примере программы оператор сопс1пце используется в качестве вспомогательного средства для вывода четных чисел в пределах от 0 до 100. Применить оператор сопггпце. цяьпч зуягешб с1аяя Сопгоешо ( ясас1с чоьй Мд1п () ( !/ вывести четные числа от 0 до 100. бог(гпя 1 = 0; 1 <= 100; ьь+) ( 1Г((142) (= О) сопяьпце) /! перейти к следуюшему шагу итерации Сопяо1е.игьгешпе(1); ) ) В данном примере выводятся только четные числа, поскольку при обнаружении нечетного числа шаг итерации цикла завершается преждевременно в обход вызова метода Игьгеб№пе () .
В циклах ыб11е и с)о-ыЬ11е оператор сопсьпце вызывает передачу управления непосредственно условному выражению, после чего продолжается процесс выполнения цикла. А в цикле гог сначала вычисляется итерационное выражение, затем условное выражение, после чего цикл продолжается. Оператор сопс1пце редко находит удачное применение, в частности, потому, что в С() предоставляется богатый набор операторов цикла, удовлетворяющих большую часть прикладных потребностей. Но в тех особых случаях, когда требуется преждевременное прерывание шага итерации цикла, оператор сопс№пце предоставляет структурированный способ осуществления такого прерывания.
Глава б. Управляющие операторы 143 Оператор ге~икгт Оператор гесцгп организует возврат из метода. Его можно также использовать для возврата значения. Более подробно он рассматривается в главе 6. Оператор до~о Имеющийся в С(( оператор посо представляет собой оператор безусловного перехода. Когда в программе встречается оператор посо, ее выполнение переходит непосредственно к тому месту, на которое указывает этот оператор. Он уже давно "вышел из употребления" в программировании, поскольку способствует созданию "макаронного" кода.
Тем не менее оператор алого все еще находит применение — иногда даже эффективное. В этой книге не делается никаких далеко идущих выводов относительно правомочности использования оператора алого для управления программой. Следует, однако, подчеркнуть, что этому оператору трудно найти полезное применение, и поэтому он не особенно нужен для полноты языка программирования. Хотя в некоторых случаях он оказывается удобным и дает определенные преимущества, если используется благоразумно. В силу этих причин оператор посо упоминается только в данном разделе книги.
Главный недостаток оператора дого с точки зрения программирования заключается в том, что он вносит в программу беспорядок и делает ее практически неудобочитаемой. Но иногда применение оператора досо может, скорее, прояснить, чем запутать ход выполнения программы. Для выполнения оператора досо требуется метка — действительный в С(( идентификатор с двоеточием. Метка должна находиться в том же методе, где и оператор посо, а также в пределах той же самой области действия.
В приведенном ниже примере программы цикл суммирования чисел от 1 до 100 организован с помощью оператора посо и соответствующей метки. х = 1) 1оор1: хтт; 1Г(х < 100) дого 1сзр1; Кроме того, оператор посо может быть использован для безусловного перехода к ветви сазе или г(егаи1С в операторе зиггс)). Формально ветви сазе или с(ебац1С выполняют в операторе змтссЬ роль меток. Поэтому они могут служить адресатами оператора досо.