В данном примере итерационное выражение в определении цикла for оказывается пустым, т.е. вообще отсутствует. Вместо этого переменная i, управляющая циклом, инкрементируется в теле самого цикла. Это означает, что всякий раз, когда цикл повторяется, значение переменной i проверяется на равенство числу 10, но никаких других действий при этом не происходит. А поскольку переменная i инкрементируется в теле цикла, то сам цикл выполняется обычным образом, выводя приведенный ниже результат. Pass #0 Pass #1 Pass #2 Pass #3 Pass #4 Pass #5 Pass #6 Pass #7 Pass #8 Pass #9
В следующем примере программы из определения цикла for исключена инициали¬ зирующая часть. // Пропуск дополнительных частей в определении цикла for. class Empty2 { public static void main(String args[]) { int i; //Из определения этого цикла исключено не только // итерационное, но и инициализирующее выражение. i = 0; for (; i < 10; ) { System.out.println("Pass #" + i) ; i++; // инкрементировать переменную управления циклом } } }
В данном примере переменная i инициализируется перед началом цикла, а не в самом цикле for. Как правило, переменная управления циклом инициализируется в цикле for. Выведение инициализирующей части за пределы цикла обычно делается лишь в том случае, если первоначальное значение управляющей им переменной получается в результате сложного процесса, который нецелесообразно вводить в само определение цикла for. Бесконечный цикл
Если оставить пустым выражение условия в определении цикла for, то получится бесконечный цикл, т.е. такой цикл, который никогда не завершается. В качестве примера в следующем фрагменте кода показано, каким образом в Java обычно создается бесконечный цикл: for(;;) // цикл, намеренно сделанный бесконечным { // ... }
Этот цикл будет выполняться бесконечно. Несмотря на то что бесконечные циклы требуются для решения некоторых задач программирования, например при разработке командных процессоров операционных систем, большинство так называемых “бесконечных” циклов на самом деле представляют собой циклы со специальными требованиями к завершению. (Подробнее об этом речь пойдет ближе к концу главы, но, как правило, выход из бесконечного цикла осуществляется с помощью оператора break.) Циклы без тела
В Java допускается оставлять пустым тело цикла for или любого другого цикла, поскольку пустой оператор с точки зрения синтаксиса этого языка считается действительным. Циклы без тела нередко оказываются полезными. Например, в следующей программе цикл без тела служит для получения суммы чисел от 1 до 5: // Тело цикла for может быть пустым, class Empty3 { public static void main(String args[]) { int i; int sum = 0; // Несмотря на отсутствие тела, в этом цикле // производится суммирование чисел от 1 до 5! for(i =1; i <= 5; sum += i++) ; System.out.println("Sum is " + sum); } }
Выполнение этой программы дает следующий результат: Sum is 15
Обратите внимание на то, что процесс суммирования чисел выполняется полностью в операторе цикла for, и для этого тело цикла не требуется. В этом цикле особое внимание обращает на себя итерационное выражение. sum += i++
Подобные операторы не должны вас смущать. Они часто встречаются в программах, профессионально написанных на Java, и становятся вполне понятными, если разобрать их по частям. Дословно приведенный выше оператор означает следующее: сложить со значением переменной sum результат суммирования значений переменных sum и i, а затем инкрементировать значение переменной i. Следовательно, данный оператор равнозначен следующей последовательности операторов: sum = sum + i; i++; Объявление управляющих переменных в цикле for
Нередко переменная, управляющая циклом for, требуется только для выполнения самого цикла и нигде больше не используется. В таком случае управляющую переменную можно объявить в инициализирующей части оператора цикла for. Например, в приведенной ниже программе вычисляется сумма и факториал чисел от 1 до 5, а переменная i, управляющая циклом for, объявляется в этом цикле. // Объявление переменной управления циклом в самом цикле for. class ForVar { public static void main(String args[]) { int sum = 0; int fact = 1; // Вычисление факториала чисел от 1 до 5. // Переменная управления объявляется в этом цикле for. for(int i = 1; i <= 5; i++) { sum += i; // Она доступна во всем цикле, fact *= i; } //Но недоступна за пределами цикла. System.out.println("Sum is " + sum); System.out.println("Factorial is " + fact); } }
Объявляя переменную в цикле for, не следует забывать о том, что область действия этой переменной ограничивается пределами оператора цикла for. Это означает, что за пределами цикла действие данной переменной прекращается. Так, в приведенном выше примере переменная i оказывается недоступной за пределами цикла for. Для того чтобы использовать переменную управления циклом в каком-нибудь другом месте программы, ее нельзя объявлять в цикле for.
Прежде чем переходить к чтению последующих разделов этой главы, поэкспериментируйте с собственными разновидностями цикла for. В ходе эксперимента вы непременно обнаружите замечательные свойства этого цикла. Расширенный цикл for
С недавних пор в распоряжение программирующих на Java предоставлен так называемый расширенный цикл for, обеспечивающий специальные средства для перебора объектов из коллекции, например из массива. Расширенный цикл for будет представлен в главе 5 при рассмотрении массивов. Цикл while
Еще одной разновидностью циклов в Java является while. Ниже приведена общая форма этого цикла. while (условие) оператор;
где оператор — это единственный оператор или блок операторов, а условие означает конкретное условие управления циклом и может быть любым логическим выражением. В этом цикле оператор выполняется до тех пор, пока условие истинно. Как только условие становится ложным, управление программой передается строке кода, следующей непосредственно после цикла.
Ниже приведен простой пример использования цикла while для вывода на экран букв английского алфавита. // Демонстрация цикла while, class WhileDemo { public static void main(String args[]) { char ch; // вывести буквы английского алфавита, используя цикл while ch = 'а'; while(ch <= 1z1) { System.out.print(ch); ch++; } } }
В данном примере переменная ch инициализируется кодом буквы а. На каждом шаге цикла на экран сначала выводится значение переменной ch, а затем это значение увеличивается на единицу. Процесс продолжается до тех пор, пока значение переменной ch не станет больше кода буквы z.
Как и в цикле for, в цикле while проверяется условное выражение, указываемое в самом начале цикла. Это означает, что код в теле цикла может вообще не выполняться, а кроме того, избавляет от необходимости производить отдельную проверку перед самим циклом. Данное свойство цикла while демонстрируется в следующем примере программы, где вычисляются целые степени числа 2 от 0 до 9. // Вычисление целых степеней числа 2. class Power { public static void main(String args[]) { int e; int result; for(int i=0; i < 10; i++) { result = 1; e = i; while(e > 0) { result *= 2; e--; } System.out.println("2 to the " + i + " power is " + result); } }
Ниже приведен результат выполнения данной программы. 2 to the 0 power is 1 2 to the 1 power is 2 2 to the 2 power is 4 2 to the 3 power is 8 2 to the 4 power is 16 2 to the 5 power is 32 2 to the 6 power is 64 2 to the 7 power is 128 2 to the 8 power is 256 2 to the 9 power is 51.2