В данном примере запятыми разделяются два оператора инициализации и еще два итерационных выражения. Когда цикл начинается, инициализируются обе пере менные, i и j. Всякий раз, когда цикл повторяется, переменная i инкрементируется, а переменная j декрементируется. Применение нескольких переменных управления циклом нередко оказывается удобным, упрощая некоторые алгоритмы. Теоретически в операторе цикла for может присутствовать любое количество операторов иници ализации и итерации, но на практике цикл получается слишком громоздким, если применяется более двух подобных операторов.
Ниже приведен практический пример применения нескольких переменных управления циклом в операторе for. В этом примере программы используются две переменные управления одним циклом for для выявления наибольшего и наи меньшего множителя целого числа (в данном случае — 100). Обратите особое вни мание на условие окончания цикла. Оно опирается на обе переменные управления циклом. // Использовать запятые в операторе цикла for для // выявления наименьшего и наибольшего множителя числа. using System; class Comma { static void Main { int i, j; int smallest, largest; int num; num = 100; smallest = largest = 1; for(i=2, j=num/2; (i <= num/2) & (j >= 2); i++, j--) { if((smallest == 1) & ((num % i) == 0)) smallest = i; if((largest == 1) & ((num % j) == 0)) largest = j; } Console.WriteLine("Наибольший множитель: " + largest); Console.WriteLine("Наименьший множитель: " + smallest); } }
Ниже приведен результат выполнения этой программы. Наибольший множитель: 50 Наименьший множитель: 2
Благодаря применению двух переменных управления циклом удается выявить наи меньший и наибольший множители числа в одном цикле for. В частности, управляю щая переменная i служит для выявления наименьшего множителя. Первоначально ее значение устанавливается равным 2 и затем инкрементируется до тех пор, пока не пре высит половину значения переменной num. А управляющая переменная j служит для выявления наибольшего множителя. Ее значение первоначально устанавливается рав ным половине значения переменной num и затем декрементируется до тех пор, пока не станет меньше 2. Цикл продолжает выполняться до тех пор, пока обе переменные, i и j, не достигнут своих конечных значений. По завершении цикла оба множителя оказываются выявленными. Условное выражение
Условным выражением, управляющим циклом for, может быть любое действи тельное выражение, дающее результат типа bool. В него не обязательно должна вхо дить переменная управления циклом. В следующем примере программы управление циклом for осуществляется с помощью значения переменной done. // Условием выполнения цикла может служить любое выражение типа bool. using System; class forDemo { static void Main { int i, j; bool done = false; for(i=0, j=100; !done; i++, j--) { if(i*i >= j) done = true; Console.WriteLine("i, j: " + i + " " + j); } } }
Ниже приведен результат выполнения этой программы. i, j: 0 100 i, j: 1 99 i, j: 2 98 i, j: 3 97 i, j: 4 96 i, j: 5 95 i, j: 6 94 i, j: 7 93 i, j: 8 92 i, j: 9 91 i, j: 10 90
В данном примере цикл for повторяется до тех пор, пока значение переменной done типа не окажется истинным (true). Истинное значение переменной done уста навливается в цикле, когда квадрат значения переменной i оказывается больше или равным значению переменной j. Отсутствующие части цикла
Ряд интересных разновидностей цикла for получается в том случае, если оставить пустыми отдельные части определения цикла. В C# допускается оставлять пустыми любые или же все части инициализации, условия и итерации в операторе цикла for. В качестве примера рассмотрим такую программу. // Отдельные части цикла for могут оставаться пустыми. using System; class Empty { static void Main { int i; for(i = 0; i < 10; ) { Console.WriteLine("Проход №" + i); i++; // инкрементировать переменную управления циклом } } }
В данном примере итерационное выражение в определении цикла for оказывается пустым, т.е. оно вообще отсутствует. Вместо этого переменная i, управляющая ци клом, инкрементируется в теле самого цикла. Это означает, что всякий раз, когда цикл повторяется, значение переменной i проверяется на равенство числу 10, но никаких других действий при этом не происходит. А поскольку переменная i инкрементиру ется в теле цикла, то сам цикл выполняется обычным образом, выводя приведенный ниже результат. Проход №0 Проход №1 Проход №2 Проход №3 Проход №4 Проход №5 Проход №6 Проход №7 Проход №8 Проход №9