Files
freeCodeCamp/guide/russian/c/switch/index.md

6.5 KiB
Raw Blame History

title, localeTitle
title localeTitle
switch case switch case

switch case

Оператор switch похож на набор операторов if .

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

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

Синтаксис switch...case

switch (n) 
 { 
    case constant1: 
        // код, который необходимо выполнить в случае, если n равно constant1; 
        break; 
 
    case constant2: 
        // код, который необходимо выполнить в случае, если n равно constant2; 
        break; 
        . 
        . 
        . 
    default: 
        // код, который необходимо выполнить в случае, если n не равно ни одной из констант
 } 

Пример

Использование оператора switch вместо нескольких операторов if/else может способствовать большей скорости и удобочитаемости.

# include <stdio.h> 
 
 int main() { 
 
    char operator; 
    double firstNumber,secondNumber; 
 
    printf("Enter an operator (+, -, *, /): "); 
    scanf("%c", &operator); 
 
    printf("Enter two operands: "); 
    scanf("%lf %lf",&firstNumber, &secondNumber); 
 
    switch (operator) { 
        case '+': 
            printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber+secondNumber); 
            break; 
        case '-': 
            printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber-secondNumber); 
            break; 
        case '*': 
            printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber*secondNumber); 
            break; 
        case '/': 
            printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber/firstNumber); 
            break; 
        // operator не равен ни одной из констант в case (+, -, *, /) 
        default: 
            printf("Error! Operator is not correct"); 
    } 
 
    return 0; 
 } 

Вывод:

 -> Enter an operator (+, -, *,): - 
 -> Enter two operands: 32.5 
 -> 12.4 
 -> 32.5 - 12.4 = 20.1 

Обзор: switch vs if/else

  • Проверьте выражение тестирования: оператор if/else может тестировать выражения на основе диапазонов значений или условий, тогда как оператор switch проверяет выражения, основанные только на одиночном целом числе, перечисляемом значении или строке.
  • switch более подходит для множественных ветвлений: когда компилятор компилирует оператор switch, он проверяет каждую из констант case и создает «таблицу переходов», которую он будет использовать для выбора пути выполнения в зависимости от значения выражения. Поэтому, если нам нужно выбрать среди большой группы значений, оператор switch будет работать намного быстрее, чем эквивалентная логика, реализованная с использованием последовательности операторов if/else. Компилятор может это сделать, потому что он знает, что константы case имеют одинаковый тип и просто должны сравниваться на равенство с выражением switch, тогда как в случае операторов if у компилятора нет таких сведений.
  • if/else лучше для логических значений: условные ветви оператора if/else отлично подходят для переменных условий, которые вычисляются в булево значение, тогда как операторы switch отлично подходят для фиксированных значений данных.
  • Скорость. Оператор switch может оказаться быстрее чем if/else, при условии, достаточно большого количества меток case. Если меток case мало, это может не оказать влияние на скорость. Отдавайте предпочтение switch в случае, когда количество меток case превышает 5, иначе можно также использовать if/else.
  • Если switch содержит более пяти веток, он реализуется с помощью таблицы поиска или хеш-листа. Это означает, что все элементы получают одинаковое время доступа, в отличие от списка веток if/else, где достижение последнего элемента занимает гораздо больше времени, поскольку необходимо вычислить все предыдущие условия.
  • Ясность и удобочитаемость: switch выглядит намного чище, если вам приходится комбинировать метки case. Операторы if помимо прочего очень уязвимы для ошибок. Пропущенное ключевое слово else может нанести вам большой ущерб. Добавление и удаление меток в операторе switch значительно проще и делает ваш код значительно легче модифицируемым и поддерживаемым.