Оператор выбора switch

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


Содержание



1. Какое назначение в программах имеет оператор выбора switch?

Оператор выбора switch есть близок к оператору условного перехода if — else. Он позволяет организовать разветвление процесса выполнения в программе. В некоторых случаях использование оператора выбора switch дает более компактный программный код в сравнении с оператором условного перехода if — else.

 

2. Какая общая форма оператора выбора switch?

В C-ориентированных языках программирования, к которым принадлежит и Java, оператор выбора switch имеет одинаковую общую форму представления:

switch (выражение)
{
    case значение1:
        // операторы
        ...
    break;
    case значение2:
        // операторы
        ...
    break;

    ...

    case значениеN:
        // операторы
        ...
    break;
    default:
        // операторы, которые выполняются по умолчанию
        ...
}

где

  • выражение – управляющее выражение, которое может иметь один из целочисленных типов: byte, int, short, char или перечислительный тип. В новых версиях JDK выражение может иметь тип String.
  • значение1, значение2, …, значениеN – константные выражения (литеральные значения). Каждое значение должно быть совместимым по типу с указанным выражением.

Блок default может отсутствовать.

 

3. Принцип работы оператора switch

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

Оператор break необходим для немедленного выхода из оператора switch. Если выполняется оператор break, тогда выполняется следующий после switch оператор.

 

4. Пример использования оператора выбора switch, в котором есть блок default

По заданному значению n = 1..7 вывести название соответствующего дня недели. Учесть возможные ошибочные значения n.

// оператор выбора switch
int n;
String s;

// ввод значения n
n = 6;

switch (n)
{
    case 1:
        s = "Понедельник";
    break;
    case 2:
        s = "Вторник";
    break;
    case 3:
        s = "Среда";
    break;
    case 4:
        s = "Четверг";
    break;
    case 5:
        s = "Пятница";
    break;
    case 6:
        s = "Суббота";
    break;
    case 7:
        s = "Воскресенье";
    break;
    default:
        s = "Неправильно введен день";
}

System.out.println(s);

 

5. Пример использования оператора switch, в котором пропущены операторы break

Как известно, оператор break, может отсутствовать.

В данном примере по введенному значению номера дня недели n = 1..7 определяется выходной этот день или рабочий.

// оператор выбора switch
int n;
String s;

// ввод значения n
n = 3;

switch (n)
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        s = "Рабочий день";
    break;
    case 6:
    case 7:
        s = "Выходной день";
    break;
    default:
        s = "Неправильно введен день";
}

System.out.println(s);

 

6. Пример использования оператора switch, в котором отсутствует блок default

Дано целое число n = 1..3. По данному значению переменной n определить:

  1. длину окружности;
  2. площадь круга;
  3. объем шара.
// оператор выбора switch
int n;
double pi = 3.1415;
double r;

// ввод значений n, r
// ...

switch (n)
{
    case 1:
        double d = 2*pi*r;
        System.out.println("Длина окружности = " + d);
    break;
    case 2:
        double s = pi*r*r;
        System.out.println("Площадь круга = " + s);
    break;
    case 3:
        double v = 4.0/3.0 * pi*r*r*r;
        System.out.println("Объем шара = " + v);
    break;
}

 

7. Вложенные инструкции switch. Пример

Инструкция switch может содержать другую, вложенную инструкцию switch. В каждом операторе switch определяется свой блок кода. Блоки кода есть независимыми друг от друга.

Пример. В данном примере на основании номера года (year) и месяца (month) вычисляется количество дней в месяце (переменная days). Задача решена с использованием вложенных операторов if и switch

// вычисление количества дней в месяце года
int f;
int year;
int month;
int days;

// заданы месяц и год
year = 2404;
month = 2;

switch(month) {
    case 4: case 6: case 9: case 11:
        days = 30;
        break;
    case 2: // месяц февраль
        f = 0; 

        // вложенный оператор if
        if (year%400==0) f=1;
        else
        if (year%100==0) f=0;
        else
        if (year%4==0) f=1;

        // вложенный оператор switch
        switch (f) {
            case 0:
                days=28;
                break;
            default:
                days=29;
        }
        break;
    default:
        days = 31; 
} 
System.out.println("Days = " + days);

 

8. Преимущества оператора switch в сравнении с оператором if

В сравнении с оператором if преимущества оператора switch следующие:

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

 

9. Недостатки оператора switch в сравнении с оператором if

В сравнении с оператором if, оператор switch имеет следующие недостатки:

  • в операторе switch, в каждой ветви выполняется проверка только на равенство (поиск на совпадение в ветви case). В операторе if в каждой ветви можно вычислять любое логическое выражение любого типа;
  • в операторе switch выражение, которое сравнивается может быть только типа int, перечислением enum или типа String (начиная с версии JDK 7). Выражение не может быть типом с плавающей запятой. В операторе if сравниваемое выражение может быть любого типа;
  • в двух разных ветвях case константы не могут иметь одинаковые значения. Одинаковые значения в ветвях case допускаются, только когда эти ветви размещаются на разных уровнях вложения в случае вложенных операторов switch.

 


Связанные темы