Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Оператор switch. Вложенные операторы switch




Оператор switch

Оператор switch – оператор ветвления в Java. Он предлагает простой способ направления потока выполнения команд по различным ветвям кода в зависимости от значения управляющего выражения. Часто он оказывается эффективнее применения длинных последовательностей операторов if-else-if. Общая форма оператора switch имеет следующий вид:

switch (выражение) {

case значение1:

// последовательность операторов

break;

case значение2:

// последовательность операторов

break;

...

...

...

case значениеN:

// последовательность операторов

break;

default:

// последовательность операторов, выполняемая по умолчанию

}

Выражение должно иметь тип type, short, int или char. Тип каждого значения, указанного в операторах case должен быть совместим с типом выражения. Дублирование значений case не допускается.

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

Оператор break внутри последовательности switch служит для прерывания последовательности операторов. Как только программа доходит до оператора break, она продолжает выполнение с первой строки кода, следующей за всем оператором switch. Этот оператор оказывает действие “выхода” из оператора switch.

Ниже представлен простой пример использования оператора switch.

// Простой пример применения оператора switch.

class SampleSwitch {

public static void main(String args[]) {

for(int i=0; i< 6; i++)

switch(i) {

case 0:

System. out. println(" i равно нулю. " );

break;

case 1:

System. out. println(" i равно единице. " );

break;

case 2:

System. out. println(" i равно двум. " );

break;

case 3:

System. out. println(" i равно трем. " );

break;

default:

System. out. println(" i больше 3. " );

}

}

}

Эта программа генерирует следующий вывод:

i равно нулю.

i равно единице.

i равно двум.

i равно трем.

i больше 3.

i больше 3.

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

Оператор break не обязателен. Если его опустить, программа продолжит выполнение со следующего оператора case. В некоторых случаях желательно использовать несколько операторов case без разделяющих их операторов break. Например, рассмотрим следующую программу:

// В последовательности switch операторы break необязательны.

class MissingBreak {

public static void main(String args[]) {

for(int i=0; i< 12; i++)

switch(i) {

case 0:

case 1:

case 2:

case 3:

case 4:

System. out. println(" i меньше 5" );

break;

case 5:

case 6:

case 7:

case 8:

case 9:

System. out. println(" i меньше 10" );

break;

default:

System. out. println(" i равно или больше 10" );

}

}

}

Эта программа генерирует следующий вывод:

i меньше 5

i меньше 5

i меньше 5

i меньше 5

i меньше 5

i меньше 10

i меньше 10

i меньше 10

i меньше 10

i меньше 10

i равно или больше 10

i равно или больше 10

Как видите, программа выполняет каждый из операторов case, пока не достигнет оператора break (или конца оператора switch).

Хотя приведенный пример был создан специально в качестве иллюстрации, пропуск операторов break находит множество применений в реальных программах. В качестве более реалистичного примера мы рассмотрим измененную версию приведенной ранее программы со временами года. В этой версии мы использовали оператор switch, что позволило создать более эффективную реализацию.

// Усовершенствованная версия программы с временами года.

class Switch {

public static void main(String args[]) {

int month = 4;

String season;

switch (month) {

case 12:

case 1:

case 2:

season = " зиме";

break;

case 3:

case 4:

case 5:

season = " весне";

break;

case 6:

case 7:

case 8:

season = " лету";

break;

case 9:

case 10:

case 11:

season = " осени";

break;

default:

season = " вымышленным месяцам";

}

System. out. println(" Апрель относится к" + season + ". " );

}

}

Вложенные операторы switch

Оператор switch можно использовать в последовательности операторов внешнего оператора switch. Такой оператор называют вложенным оператором switch. Поскольку оператор switch определяет собственный блок, каких-либо конфликтов между константами case внутреннего и внешнего операторов switch не происходит. Например, следующий фрагмент полностью допустим:

switch(count) {

case 1:

switch(target) {// вложенный оператор switch

case 0:

System. out. println(" target равна 0" );

break;

case 1: // конфликты с внешним оператором switch отсутствуют

System. out. println(" target равна 1" );

break;

}

break;

case 2: //...

В данном случае оператор case1: внутреннего оператора switch не конфликтует с оператором case1: внешнего оператора switch. Программа сравнивает значение переменной count только со списком ветвей case внешнего уровня. Если значение count равно 1, программа сравнивает значение переменной target c внутренним списком ветвей case.

Как правило, оператор switch эффективнее набора вложенных операторов if.

Это представляет особый интерес, поскольку позволяет понять работу компилятора Java. Компилируя оператор switch, компилятор Java будет проверять каждую из констант case и создавать “таблицу переходов”, которую будет использовать для выбора ветви программы в зависимости от значения выражения. Поэтому в тех случаях, когда требуется осуществлять выбор в большой группе значений, оператор switch будет выполняться значительно быстрее последовательности операторов if-else. Это обусловлено тем, что компилятору известно, что все константы case имеют один и тот же тип, и их нужно просто проверять на предмет равенства значению выражения switch.

Компилятор не располагает подобными сведениями о длинном списке выражений оператора if.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...