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