355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Герберт Шилдт » Java: руководство для начинающих (ЛП) » Текст книги (страница 6)
Java: руководство для начинающих (ЛП)
  • Текст добавлен: 6 октября 2016, 05:33

Текст книги "Java: руководство для начинающих (ЛП)"


Автор книги: Герберт Шилдт



сообщить о нарушении

Текущая страница: 6 (всего у книги 36 страниц)

Глава 3 Управляющие операторы

Основные навыки и понятия

Ввод символов с клавиатуры

Полная форма условного оператора if

Применение оператора switch

Полная форма цикла for

Применение цикла while

Применение цикла do-while

Применение оператора break для выхода из цикла

Использование оператора break в качестве оператора goto

Применение оператора continue

Вложенные циклы

В этой главе вы ознакомитесь с операторами, управляющими ходом выполнения программы. Существуют три категории управляющих операторов: операторы выбора,к числу которых относятся операторы if и switch, итерационные операторы, в том числе операторы цикла for, while, do-while, а также операторы перехода, включая break, continue и return. Все эти управляющие операторы, кроме оператора return, обсуждаемого далее в книге, подробно рассматриваются в этой главе, в начале которой будет показано, каким образом организуется простой ввод данных с клавиатуры. Ввод символов с клавиатуры

Прежде чем приступать к рассмотрению управляющих операторов в Java, уделим немного внимания средствам, которые позволяют писать интерактивные программы. В рассмотренных до сих пор примерах программ данные выводились на экран, но у пользователя не было возможности вводить данные. В этих программах, в частности, применялся консольный вывод, но не консольный ввод (с клавиатуры). И объясняется это тем, что возможности ввода данных с клавиатуры в Java опираются на языковые средства, рассматриваемые далее в этой книге. Кроме того, большинство реальных программ на Java и апплетов имеют графический и оконный, а не консольный интерфейс. Именно по этим причинам консольный ввод нечасто применяется в примерах программ, представленных в данной книге. Но имеется один вид консольного ввода, который реализуется очень просто. Это чтение символов с клавиатуры. А поскольку ввод символов применяется в ряде примеров, представленных в этой главе, мы и начнем ее с обсуждения данного вопроса.

Для чтения символа с клавиатуры достаточно вызвать метод System.in.read (), где System.in – объект ввода (с клавиатуры), дополняющий объект вывода System, out. Метод read () ожидает нажатия пользователем клавиш, после чего возвращает результат. Возвращаемый им символ представлен целочисленным значением, и поэтому, прежде чем присвоить его символьной переменной, следует выполнить явное его приведение к типу char. По умолчанию данные, вводимые с консоли, буферизуются построчно. Под термином буфер здесь подразумевается небольшая область памяти, выделяемая для хранения символов перед тем, как они будут прочитаны программой. В данном случае в буфере хранится целая текстовая строка, и поэтому для передачи программе любого введенного с клавиатуры символа следует нажать клавишу . Ниже приведен пример программы, читающей символы, вводимые с клавиатуры. // Чтение символа с клавиатуры, class KbIn { public static void main(String args[]) throws java.io.IOException { char ch; System.out.print("Press a key followed by ENTER: "); // Ввод символа с клавиатуры. ch = (char) System.in.read(); // получить значение типа char System.out.println("Your key is: " + ch); } }

Выполнение этой программы может дать, например, следующий результат: Press a key followed by ENTER: t Your key is: t

Обратите внимание на то, что метод main () начинается со следующих строк кода: public static void main(String args[]) throws java.io.IOException {

В рассматриваемой здесь программе применяется метод System, in. read (), и поэтому в ее код следует ввести оператор throws j ava. io. IOException. Этот оператор требуется для обработки ошибок, которые могут возникнуть в процессе ввода данных. Он является частью механизма обработки исключений в Java, более подробно рассматриваемого в главе 9. А до тех пор не обращайте особого внимания на этот оператор, принимая во внимание лишь его назначение.

Построчная буферизация вводимых данных средствами System, in часто приводит к недоразумениям. При нажатии клавиши в поток ввода записывается последовательность, состоящая из символов возврата каретки и перевода строки. Эти символы ожидают чтения из буфера ввода. Поэтому в некоторых приложениях, возможно, потребуется удалить символы возврата каретки и перевода строки, прежде чем переходить к следующей операции ввода. Для этого достаточно прочитать их из буфера ввода. Соответствующий пример реализации подобного решения на практике будет представлен далее в главе. Условный оператор if

Этот условный оператор уже был представлен в главе 1, а здесь он будет рассмотрен более подробно. Ниже приведена полная форма условного оператора if. if(условие) оператор; else оператор;

где условие – это некоторое условное выражение, а оператор – адресат операторов if и else. Оператор else не является обязательным. Адресатами обоих операторов, if и else, могут также служить блоки операторов. Ниже приведена общая форма условного оператора if, в котором используются блоки операторов. if (условие) { последовательность операторов } else { последовательность операторов }

Если условное выражение оказывается истинным, то выполняется адресат оператора if. В противном случае выполняется адресат оператора else, если таковой существует. Но одновременно не может выполняться и то и другое. Условное выражение, управляющее оператором if, должно давать результат типа bool.

Для того чтобы продемонстрировать применение оператора i f (и ряда других управляющих операторов) на практике, разработаем простую игру, основанную на угадывании. Возможно, она понравится вашим детям. В первой версии этой игры программа предложит пользователю угадать задуманную букву от А до Z. Если пользователь правильно угадает букву и нажмет на клавиатуре соответствующую клавишу, программа выведет сообщение Right (Правильно). Ниже приведен исходный код программы, реализующей эту игру. // Игра в угадывание букв, class Guess { public static void main(String args[]) throws java.io.IOException { char ch, answer = 'S'; System.out.println(«Ifm thinking of a letter between A and Z.»); System.out.print("Can you guess it: "); ch = (char) System.in.read(); // прочитать символ с клавиатуры if(ch == answer) System.out.println(«** Right **»); } }

Эта программа выводит на экран сообщение с предложением угадать букву, а затем читает символ с клавиатуры. Используя условный оператор if, она сравнивает введенный символ с правильным ответом (в данном случае это буква S). Если введена буква S, то отображается сообщение об угадывании буквы. Опробуя эту программу, не забывайте, что угадываемую букву следует вводить в верхнем регистре.

В следующей версии программы оператор else используется для вывода сообщения о том, что буква не была угадана. // Игра в угадывание букв, вторая версия class Guess2 { public static void main(String args[]) throws java.io.IOException { Глава 3. Управляющие операторы char ch, answer = 'S'; System.out.println("I'm thinking of a letter between A and Z."); System.out.print("Can you guess it: "); ch = (char) System.in.read(); // ввести символ с клавиатуры if(ch == answer) System.out.println("** Right **"); else System.out.println("...Sorry, you're wrong."); } } Вложенные условные операторы if

Вложенные операторы if представляют собой условные операторы if, являющиеся адресатами оператора else. Подобные условные операторы очень часто встречаются в программах. Но, пользуясь ими, следует помнить, что в Java оператор else всегда связан с ближайшим к нему оператором if, находящимся в том же кодовом блоке и не связанном с другим оператором else. Рассмотрим следующий пример: if(i == 10) { if(j < 20) а = b; if(к > 100) с = d; else а = с; // этот оператор else относится к оператору if(к > 100) } else а = d; // а этот оператор else относится к оператору if(i == 10)

Как следует из комментариев к приведенному выше фрагменту кода, последний оператор else не имеет отношения к оператору if (j < 20), поскольку он не находится с ним в одном кодовом блоке, несмотря на то, что это ближайший оператор if, не имеющий себе в пару оператор else. Следовательно, последний оператор else относится к оператору if(i == 10). А в кодовом блоке оператор else связан с оператором if (к > 100), поскольку это самый близкий из всех находящихся к нему операторов if в том же самом блоке.

Используя вложенные условные операторы if, можно усовершенствовать игру, рассматриваемую здесь в качестве примера. Теперь при неудачной попытке угадать букву пользователю предоставляется дополнительная информация, подсказывающая, насколько он далек от правильного ответа. // Игра в угадывание букв, третья версия, class Guess3 { public static void main(String args[]) throws java.io.IOException { char ch, answer = 'S'; System.out.println("I'm thinking of a letter between A and Z."); System.out.print("Can you guess it: "); ch = (char) System.in.read(); // ввести символ с клавиатуры if(ch == answer) System.out.println("** Right **"); else { 90 Java 7: руководство для начинающих, 5-е издание System.out.print("...Sorry, you're "); // вложенный оператор if if(ch < answer) System.out.println("too low"); else System.out.println("too high"); } } }

Выполнение этой программы может дать, например, следующий результат: I'm thinking of a letter between A and Z. Can you guess it: Z ...Sorry, you're too high Многоступенчатая конструкция if-else-if

В программировании часто применяется многоступенчатая конструкция if-else-if, состоящая из вложенных уловных операторов if. Ниже приведена ее общая форма. if (условие) оператор; else if (условие) оператор; else if (условие) оператор; else оператор;

Условные выражения в такой конструкции вычисляются сверху вниз. Как только обнаружится истинное условие, выполняется связанный с ним оператор, а все остальные операторы в многоступенчатой конструкции опускаются. Если ни одно из условий не является истинным, то выполняется последний оператор else, который зачастую служит в качестве условия, устанавливаемого по умолчанию. Когда же последний оператор else отсутствует, а все остальные проверки по условию дают ложный результат, никаких действий вообще не выполняется.

Ниже приведен пример программы, демонстрирующий применение многоступенчатой конструкции if-else-if. // Демонстрация многоступенчатой конструкции if-else-if. class Ladder { public static void main(String args[]) { int x; for(x=0; x<6; x++) { if(x==l) System.out.println("x is one"); else if(x==2) System.out.println("x is two"); else if(x==3) System.out.println("x is three"); else if(x==4) System.out.println("x is four"); else // Условие, выполняемое по умолчанию. System.out.println("х is not between 1 and 4й); } } }

Выполнение этой программы дает следующий результат: х is not between 1 and 4 x is one x is two x is three x is four x is not between 1 and 4

Как видите, устанавливаемый по умолчанию условный оператор else выполняется лишь в том случае, если проверки по условию всех предыдущих операторов if дают ложный результат. Оператор switch

Вторым оператором выбора в Java является оператор switch, который обеспечивает многонаправленное ветвление программы. Следовательно, этот оператор позволяет сделать выбор среди нескольких альтернативных вариантов дальнейшего выполнения программы. Несмотря на то что многонаправленная проверка может быть организована с помощью последовательного ряда вложенных условных операторов if, во многих случаях более эффективным оказывается применение оператора switch. Этот оператор действует следующим образом. Значение выражения последовательно сравнивается с константами выбора из заданного списка. Как только будет обнаружено совпадение с одним из условий выбора, выполняется последовательность операторов, связанных с этим условием. Ниже приведена общая форма оператора switch. switch(выражение) { case константа1: последовательность операторов break; case константа2: последовательность операторов break; case константаЗ: последовательность операторов break; default: последовательность операторов }

В версиях Java, предшествующих JDK 7, выражение, управляющее оператором switch, должно быть типа byte, short, int, char или перечислением. (Подробнее о перечислениях речь пойдет в главе 12.)

Начиная с версии JDK 7, выражение может относиться к типу String. Это означает, что в современных версиях Java для управления оператором switch можно пользоваться символьной строкой. (Этот прием программирования демонстрируется в главе 5 при рассмотрении класса String.) Но зачастую в качестве выражения, управляющего оператором switch, вместо сложного выражения употребляется простая переменная.

Последовательность операторов из ветви default выполняется в том случае, если ни одна из констант выбора не совпадает с заданным выражением. Ветвь default не является обязательной. Если же она отсутствует и выражение не совпадает ни с одним из условий выбора, то никаких действий вообще не выполняется. Если же происходит совпадение с одним из условий выбора, то выполняются операторы, связанные с этим условием, вплоть до оператора break.

Ниже приведен пример программы, демонстрирующий применение оператора switch. // Демонстрация оператора switch, class SwitchDemo { public static void main(String args[]) { int i; for(i=0; i<10; i++) switch (i) { case 0: System.out.println ("i is zero"); break; case 1: System.out.println("i is one"); break; case 2: System.out.println("i is two"); break; case 3: System.out.println("i is three"); break; case 4 : System.out.println("i is four"); break; default: System.out.println("i is five or more"); } } }

Результат выполнения данной программы выглядит следующим образом: i is zero i is one i is two i is three i is four i is five or more i is five or more i is five or more i is five or more i is five or more

Как видите, на каждом шаге цикла выполняются операторы, связанные с совпадающей константой выбора в одной из ветвей case, в обход всех остальных ветвей. Когда же значение переменной i становится равным или больше пяти, оно не совпадает ни с одной из констант выбора, и поэтому управление получает выражение, следующее за оператором default.

Формально оператор break может отсутствовать, но, как правило, в реальных приложениях он применяется. При выполнении оператора break оператор switch завершает работу и управление передается следующему за ним оператору. Если же в последовательности операторов, связанных с совпадающей константой выбора в одной из ветвей case, не содержится оператор break, то сначала выполняются все операторы в этой ветви, а затем операторы, совпадающие с константой выбора в следующей ветви case. Этот процесс продолжается до тех пор, пока не встретится оператор break или же будет достигнут конец оператора switch.

В качестве упражнения проанализируйте исходный код приведенной ниже програм¬ мы. Сможете ли вы предсказать, как будет выглядеть результат ее выполнения? // Демонстрация оператора switch без оператора break, class NoBreak { > public static void main(String args[]) { int i; for(i=0; i<=5; i++) { switch(i) { case 0: // Далее следует "провал" в ветвях case оператора switch. System.out.println("i is less than one"); case 1: System.out.println("i is less than two"); case 2: System, out .println ("i is less than three")-; case 3: System.out.println("i is less than four"); case 4: System.out.println("i is less than five"); } System.out.println(); } } }

Выполнение этой программы дает следующий результат: i is less than one i is less than two i is less than three i is less than four i is less than five i is less than two i is less than three i is less than five i is less than three i is less than four i is less than five i is less than four i is less than five i is less than five

Как демонстрирует приведенный выше пример, выполнение программы будет продолжено в следующей ветви case в отсутствие оператора break. А в следующем примере кода показано, что в операторе switch могут присутствовать пустые ветви case: switch(i) { case 1: case 2: case 3: System.out.println("i is 1, 2 or 3"); break; case 4: System.out.println("i is 4"); break; }

Если в приведенном выше фрагменте кода переменная i имеет значение 1, 2 или 3, то вызывается первый метод println (). А если ее значение равно 4, вызывается второй метод println (). Такое расположение нескольких пустых ветвей case подряд нередко используется в тех случаях, когда нескольким ветвям должен соответствовать один и тот же общий код. Вложенные операторы switch

Один оператор switch может быть частью последовательности операторов другого, внешнего оператора switch. И такой оператор switch называется вложенным. Константы выбора внутреннего и внешнего операторов switch могут содержать общие значения, не вызывая никаких конфликтов. Например, следующий фрагмент кода является вполне допустимым: switch(chi) { case 'A1: System.out.println("This A is part of outer switch."); switch(ch2) { case 'A1: System.out.println("This A is part of inner switch"); break; case 'B' : // ... } // конец внутреннего оператора switch break; case 'B': // ...

Пример для опробования 3.1. Начало построения справочной системы Java

В этом проекте предстоит создать простую справочную систему, предоставляющую сведения о синтаксисе управляющих операторов Java. Программа, реализующая эту справочную систему, отображает меню с названиями операторов и ожидает выбора одного из них. Как только пользователь выберет один из пунктов меню, на экран будут выведены сведения о синтаксисе соответствующего оператора. В первой версии данной программы предоставляются сведения только об операторах if и switch. Ав последующих проектах будут добавлены справочные данные об остальных управляющих операторах.

Последовательность действий

Создайте новый файл Help.java.

В начале работы программы отображается следующее меню:Help on: 1. if 2. switch Choose one: Для этой цели потребуется приведенная ниже последовательность операторов.System.out.println("Help on:"); System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.print("Choose one: ");

Далее программа получает данные о выборе пользователя. С этой целью вызывается метод System.in.read(), как показано ниже.choice = (char) System.in.read();

После этого в программе используется оператор switch для отображения сведений о синтаксисе выбранного оператора.switch(choice) { case 111: System.out.println("The if:n"); System.out.println("if(condition) statement;"); System.out.println("else statement;"); break; case 12’ : System.out.println("The switch:n"); System.out.println("switch(expression) {"); System.out.println(" case constant:"); System.out.println(" statement sequence"); System.out.println(" break;"); System.out.println (" // ..."); System.out.println("}"); break; default: System.out.print("Selection not found."); } Обратите внимание на то, как в ветви default перехватываются сведения о неправильно сделанном выборе. Так, если пользователь введет значение 3, оно не совпадет ни с одной из констант в ветвях case оператора switch, и тогда управление будет передано коду в ветви default.

Ниже приведен весь исходный код программы из файла Help.java. /* Пример для опробования 3.1. Простая справочная система. */ class Help { public static void main(String args[]) throws java.io.IOException { char choice; System.out.println("Help on:") ; System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.print("Choose one: "); choice = (char) System.in.read(); System.out.println("n") ; switch(choice) { case '1': System.out.println("The if:n"); System.out.println("if(condition) statement;"); System.out.println("else statement;"); break; case '2': System.out.println("The switch:n"); System.out.println("switch(expression) {"); System.out.println(" case constant:"); System.out.println(" statement sequence"); System.out.println(" break;"); System.out.println (" // ..."); System.out.println ("}"); break; default: System.out.print("Selection not found."); } } }

Выполнение этой программы дает следующий результат: Help on: 1. if 2. switch Choose one: 1 The if: if(condition) statement; else statement; Цикл for

Цикл for уже был представлен в главе 1, а здесь он рассматривается более подробно. Вас должны приятно удивить эффективность и гибкость этого цикла. Прежде всего обратимся к самым основным и традиционным формам цикла for.

Ниже приведена общая форма цикла for для повторного выполнения единственного оператора. for (инициализация; условие; итерация) оператор;

А вот как выглядит его форма для повторного выполнения кодового блока. fог (инициализа ция; условие; итера ция) { последовательность операторов; }

где инициализация, как правило, представлена оператором присваивания, задающим первоначальное значение переменной, которая выполняет роль счетчика и управляет циклом; условие – это логическое выражение, определяющее необходимость повторения цикла; а итерация – выражение, определяющее величину, на которую должно изменяться значение переменной, управляющей циклом, на каждом шаге цикла. Обратите внимание на то, что эти три основные части оператора цикла for должны быть разделены точкой с запятой. Выполнение цикла for будет продолжаться до тех пор, пока проверка условия дает истинный результат. Как только эта проверка даст ложный результат, цикл завершится, а выполнение программы будет продолжено с оператора, следующего после цикла for.

Ниже приведен пример программы, где цикл for служит для вывода на экран значений квадратного корня чисел в пределах от 1 до 99. В данной программе отображается также ошибка округления, допущенная при вычислении квадратного корня. // Вывод квадратных корней чисел от 1 до 99 вместе с ошибкой округления, class SqrRoot { public static void main(String args[]) { double num, sroot, rerr; for(num = 1.0; num < 100.0; num++) { sroot = Math.sqrt(num); System.out.println("Square root of " + num + " is " + sroot); // вычислить ошибку округления rerr = num – (sroot * sroot); System.out.println("Rounding error is " + rerr); System.out.println() ; } } }

Обратите внимание на то, что ошибка округления вычисляется путем возведения в квадрат квадратного корня числа. Полученное значение отнимается от исходного числа.

Переменная цикла может как увеличиваться, так и уменьшаться, а величина приращения может выбираться произвольно. Например, в приведенном ниже фрагменте кода выводятся числа в пределах от 100 до -95, и на каждом шаге переменная цикла уменьшается на 5. // Цикл for, выполняющийся с отрицательным приращением переменной, class DecrFor { public static void main(String args[]) { int x; //На каждом шаге цикла управляющая им переменная уменьшается на 5. for(х = 100; х > -100; х -= 5) System.out.println(х); } }

В отношении циклов for следует особо подчеркнуть, что условное выражение всегда проверяется в самом начале цикла. Это означает, что код в цикле может вообще не выполняться, если проверяемое условие с самого начала оказывается ложным. Рассмотрим следующий пример: for(count=10; count < 5; count++) x += count; // этот оператор не будет выполнен

Этот цикл вообще не будет выполняться, поскольку первоначальное значение переменной count, которая им управляет, сразу же оказывается больше 5. А это означает,что условное выражение count < 5 оказывается ложным с самого начала, т.е. еще до выполнения первого шага цикла. Некоторые разновидности цикла for

Цикл for относится к наиболее универсальным операторам языка Java, поскольку он допускает самые разные варианты применения. Например, для управления циклом можно использовать несколько переменных. Рассмотрим следующий пример программы: // Применение запятых в операторе цикла for. class Comma { public static void main(String args[]) { int i, j; // Для управления этим циклом используются две переменные. for (i=0, j =10; i < j; i++, j —) System.out.println("i and j: " + i + " " + j); } }

Выполнение этой программы дает следующий результат: i and j 0 10 i and j 1 9 i and j 2 8 i and j 3 7 i and j 4 6

В данном примере запятыми разделяются два оператора инициализации и еще два итерационных выражения. Когда цикл начинается, инициализируются обе переменные, i и j. Всякий раз, когда, цикл повторяется, переменная i инкрементируется, а переменная j декрементируется. Применение нескольких переменных управления циклом нередко оказывается удобным и упрощает некоторые алгоритмы. Теоретически в цикле for может быть указано любое количество операторов инициализации и итерации, но на практике такой цикл получается слишком громоздким, если применяется больше двух подобных операторов.

Условным выражением, управляющим циклом for, может быть любое действительное выражение, дающее результат типа bool. В него не обязательно должна входить переменная управления циклом. В следующем примере программы цикл будет выполняться до тех пор, пока пользователь не введет с клавиатуры букву S. // Выполнение цикла до тех пор, пока с клавиатуры //не будет введена буква S. class ForTest { public static void main(String args[]) throws java.io.IOException { int i; System.out.println("Press S to stop."); for(i = 0; (char) System.in.read() != 'S'; i++) System.out.println("Pass #" + i); } } Пропуск отдельных частей в определении цикла for

Ряд интересных разновидностей цикла for получается в том случае, если оставить пустыми отдельные части в определении цикла. В Java допускается оставлять пустыми любые или же все части инициализации, условия и итерации в операторе цикла for. В качестве примера рассмотрим следующую программу: // Пропуск отдельных частей в определении цикла for. class Empty { public static void main(String args[]) { int i; // В определении этого цикла отсутствует итерационное выражение. for(i =0; i < 10; ) { System.out.println("Pass #" + i) ; i++; // инкрементировать переменную управления циклом } } }

В данном примере итерационное выражение в определении цикла 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.


    Ваша оценка произведения:

Популярные книги за неделю