Оператор Switch

Теги: си switch, c switch, switch break, default, порядок ветвей оператора switch.



Оператор Switch

Рассмотрим пример из темы "ветвления". Программа выводит название дня недели по порядковому номера

#include<conio.h>
#include<stdio.h>

int main() {
        unsigned day;

        printf("Enter day ");
        scanf("%d", &day);

        if (day > 7) {
                day = day % 7;
        }

        if (day == 0) {
                printf("Sunday");
        } else if (day == 1) {
                printf("Monday");
        } else if (day == 2) {
                printf("Tuesday");
        } else if (day == 3) {
                printf("Wednesday");
        } else if (day == 4) {
                printf("Thursday");
        } else if (day == 5) {
                printf("Friday");
        } else if (day == 6) {
                printf("Saturday");
        } 

        getch();
}

Этот код состоит из семи идущих друг за другом операторов if. Его код можно упростить с помощью оператора switch

#include<conio.h>
#include<stdio.h>

int main() {
        unsigned day;

        printf("Enter day ");
        scanf("%d", &day);

        if (day > 7) {
                day = day % 7;
        }

        switch (day) {
        case 0:
                printf("Sunday");
                break;
        case 1:
                printf("Monday");
                break;
        case 2:
                printf("Tuesday");
                break;
        case 3:
                printf("Wednesday");
                break;
        case 4:
                printf("Thursday");
                break;
        case 5:
                printf("Friday");
                break;
        default:
                printf("Saturday");
        }

        getch();
}

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

switch (<переменная>) {
        case <значение 1>:
                <ветвь 1>
        [case <значение 2>:
                <ветвь 2>]
        [default:
                <действия по умолчанию>]
}

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

#include<conio.h>
#include<stdio.h>

int main() {
        unsigned day;

        printf("Enter day ");
        scanf("%d", &day);

        if (day > 7) {
                day = day % 7;
        }

        switch (day) {
        case 0:
                printf("Sunday");
        case 1:
                printf("Monday");
        case 2:
                printf("Tuesday");
        case 3:
                printf("Wednesday");
        case 4:
                printf("Thursday");
        case 5:
                printf("Friday");
        default:
                printf("Saturday");
        }

        getch();
}

Введите значение, например 3, и вы увидите, что программа выведет
WednesdayThursdayFridaySaturday
то есть все ветви, после найденной.
Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше). Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные. Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
        float a, b, c;
        char op;

        scanf("%f %c %f", &a, &op, &b);
        switch (op) {
                case '+': {
                        c = a + b;
                        break;
                }
                case '-': {
                        c = a - b;
                        break;
                }
                case '/': {
                        if (b != 0.0) {
                                c = a / b;
                        } else {
                                printf("Error: divide by zero");
                                getch();
                                exit(1);
                        }
                        break;
                }
                case '*': {
                        c = a * b;
                        break;
                }
                default:
                        printf("No operation defined");
                        getch();
                        exit(1);
        }

        printf("%.6f", c);
        getch();
}

Если ввести
1 + 2
то будет выведен результат операции 1 + 2 = 3
Хочу обратить внимание, что литеры типа '+' и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch. В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.

Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать

    switch (day) {
    case 0:
        printf("Sunday");
        break;
    case 1:
        printf("Monday");
        break;
    case 2:
        printf("Tuesday");
        break;
    case 3:
        printf("Wednesday");
        break;
    case 4:
        printf("Thursday");
        break;
        default:
        printf("Saturday");
                break;
    case 5:
        printf("Friday");
        break;
    }

default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default логически располагается в конце, когда других вариантов больше нет.

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

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
int main() {
//Это, конечно, константа, но не может быть использована как
//значение для оператора switch
        const int monday = 0;
    unsigned day;
 
    printf("Enter day ");
    scanf("%d", &day);
 
    if (day > 7) {
        day = day % 7;
    }
 
    switch (day) {
    case monday:
        printf("Sunday");
        break;
    case 1:
        printf("Monday");
        break;
    case 2:
        printf("Tuesday");
        break;
    case 3:
        printf("Wednesday");
        break;
    case 4:
        printf("Thursday");
        break;
        default:
        printf("Saturday");
                break;
    case 5:
        printf("Friday");
        break;
    }
 
    getch();
}
Q&A

Всё ещё не понятно? – пиши вопросы на ящик email
Ветвления