Выбрать главу

Выполнение этой программы может дать, например, следующий результат: 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': // ...