Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Оператор break можно применять в любом цикле, предусмотренном в С#. В качестве примера ниже приведена версия предыдущей программы, переделанная с цельюиспользовать цикл do-while.// Применить оператор break для выхода из цикла do-while.using System;class BreakDemo2 { static void Main() { int i; i = -10; do { if(i > 0) break; Console.Write(i + " "); i++; } while(i <= 10); Console.WriteLine("Готово!"); }}
А теперь рассмотрим более практический пример применения оператора break.В приведенной ниже программе выявляется наименьший множитель числа.// Выявить наименьший множитель числа.using System;class FindSmallestFactor { static void Main() { int factor = 1; int num = -1000; for (int i=2; i <= num/i;' i++) { if((num%i) == 0) { factor = i; break; // прервать цикл, как только будет // выявлен наименьший множитель числа } } Console.WriteLine("Наименьший множитель равен " + factor); }}
Результат выполнения этой программы выглядит следующим образом.Наименьший множитель равен 2
Оператор break прерывает выполнение цикла for, как только будет выявлен наименьший множитель числа. Благодаря такому применению оператора break исключается опробование любых других значений после выявления наименьшего множителя числа, а следовательно, и неэффективное выполнение кода.
Если оператор break применяется в целом ряде вложенных циклов, то он прерывает выполнение только самого внутреннего цикла. В качестве примера рассмотримследующую программу.// Применить оператор break во вложенных циклах.using System;class BreakNested { static void Main() { for(int i=0; i<3; i++) { Console.WriteLine("Подсчет во внешнем цикле: " + i); Console.Write(" Подсчет во внутреннем цикле: "); int t = 0; while(t < 100) { if(t == 10) break; // прервать цикл, если t равно 10 Console.Write(t + " "); t++; } Console.WriteLine(); } Console.WriteLine("Циклы завершены."); }}
Выполнение этой программы дает следующий результат.Подсчет во внешнем цикле: 0 Подсчет во внутреннем цикле: 0 1 2 3 4 5 6 7 8 9Подсчет во внешнем цикле: 1 Подсчет во внутреннем цикле: 0 1 2 3 4 5 6 1 8 9Подсчет во внешнем цикле: 2 Подсчет во внутреннем цикле: 0 1 2 3 4 5 6 1 8 9Циклы завершены
Как видите, оператор break из внутреннего цикла вызывает прерывание толькоэтого цикла, а на выполнение внешнего цикла он не оказывает никакого влияния.
В отношении оператора break необходимо также иметь в виду следующее. Во-первых, в теле цикле может присутствовать несколько операторов break, но применять их следует очень аккуратно, поскольку чрезмерное количество операторов breakобычно приводит к нарушению нормальной структуры кода. И во-вторых, операторbreak, выполняющий выход из оператора switch, оказывает воздействие только наэтот оператор, но не на объемлющие его циклы.Применение оператора continue
С помощью оператора continue можно организовать преждевременное завершение шага итерации цикла в обход обычной структуры управления циклом. Операторcontinue осуществляет принудительный переход к следующему шагу цикла, пропуская любой код, оставшийся невыполненным. Таким образом, оператор continue служит своего рода дополнением оператора break. В приведенном ниже примере программы оператор continue используется в качестве вспомогательного средства длявывода четных чисел в пределах от 0 до 100.// Применить оператор continue.using System;class ContDemo { static void Main() { // вывести четные числа от 0 до 100. for (int i = 0; i <= 100; i++) { if((i%2) != 0) continue; // перейти к следующему шагу итерации Console.WriteLine(i); } }}
В данном примере выводятся только четные числа, поскольку при обнаружениинечетного числа шаг итерации цикла завершается преждевременно в обход вызова метода WriteLine().
В циклах while и do-while оператор continue вызывает передачу управления непосредственно условному выражению, после чего продолжается процесс выполненияцикла. А в цикле for сначала вычисляется итерационное выражение, затем условноевыражение, после чего цикл продолжается.
Оператор continue редко находит удачное применение, в частности, потому, чтов C# предоставляется богатый набор операторов цикла, удовлетворяющих большуючасть прикладных потребностей. Но в тех особых случаях, когда требуется преждевременное прерывание шага итерации цикла, оператор continue предоставляет структурированный способ осуществления такого прерывания.Оператор return
Оператор return организует возврат из метода. Его можно также использоватьдля возврата значения. Более подробно он рассматривается в главе 6.Оператор goto
Имеющийся в C# оператор goto представляет собой оператор безусловного перехода. Когда в программе встречается оператор goto, ее выполнение переходит непосредственно к тому месту, на которое указывает этот оператор. Он уже давно "вышелиз употребления" в программировании, поскольку способствует созданию "макаронного" кода. Тем не менее оператор goto все еще находит применение — иногда дажеэффективное. В этой книге не делается никаких далеко идущих выводов относительноправомочности использования оператора goto для управления программой. Следует,однако, подчеркнуть, что этому оператору трудно найти полезное применение, и поэтому он не особенно нужен для полноты языка программирования. Хотя в некоторыхслучаях он оказывается удобным и дает определенные преимущества, если используется благоразумно. В силу этих причин оператор goto упоминается только в данномразделе книги. Главный недостаток оператора goto с точки зрения программированиязаключается в том, что он вносит в программу беспорядок и делает ее практическинеудобочитаемой. Но иногда применение оператора goto может, скорее, прояснить,чем запутать ход выполнения программы.
Для выполнения оператора goto требуется метка — действительный в С# идентификатор с двоеточием. Метка должна находиться в том же методе, где и операторgoto, а также в пределах той же самой области действия. В приведенном ниже примере программы цикл суммирования чисел от 1 до 100 организован с помощью оператора goto и соответствующей метки.х = 1;loop1: х++; if(x < 100) goto loop1;
Кроме того, оператор goto может быть использован для безусловного переходак ветви case или default в операторе switch. Формально ветви case или defaultвыполняют в операторе switch роль меток. Поэтому они могут служить адресатамиоператора goto. Тем не менее оператор goto должен выполняться в пределах оператора switch. Это означает, что его нельзя использовать как внешнее средство длябезусловного перехода в оператор switch. В приведенном ниже примере программыдемонстрируется применение оператора goto в операторе switch.// Применить оператор goto в операторе switch.using System;class SwitchGoto { static void Main() { for(int i=1; i < 5; i++) { switch(i) { case 1: Console.WriteLine("В ветви case 1"); goto case 3; case 2 : Console.WriteLine("В ветви case 2"); goto case 1; case 3: Console.WriteLine("В ветви case 3"); goto default; default: Console.WriteLine("В ветви default"); break; } Console.WriteLine(); } // goto case 1; // Ошибка! Безусловный переход к оператору switch недопустим. }}
Вот к какому результату приводит выполнение этой программы.В ветви case 1В ветви case 3В ветви defaultВ ветви case 2В ветви case 1В ветви case 3В ветви defaultВ ветви case 3В ветви defaultВ ветви default
Обратите внимание на то, как оператор goto используется в операторе switch дляперехода к другим его ветвям case иди к ветви default. Обратите также вниманиена то, что ветви case не оканчиваются оператором break. Благодаря тому что оператор goto препятствует последовательному переходу от одной ветви case к другой,упоминавшееся ранее правило недопущения "провалов" не нарушается, а следовательно, необходимость в применении оператора break в данном случае отпадает. Нокак пояснялось выше, оператор goto нельзя использовать как внешнее средство длябезусловного перехода к оператору switch. Так, если удалить символы комментарияв начале следующей строки:// goto case 1; // Ошибка! Безусловный переход к оператору switch недопустим.