Почему оператор switch, а не if-else?

Мне это интересно уже некоторое время. Я далеко не хардкорный программист, в основном небольшие скрипты на Python, и я написал пару симуляций молекулярной динамики. Для реального вопроса: Какова точка оператора switch ? Почему вы не можете просто использовать оператор if-else?

Спасибо за ваш ответ, и если это было задано, прежде чем указывать мне ссылку.

ИЗМЕНИТЬ

S.Lott указал, что это может быть дубликат вопросов If/Else vs. Switch. Если вы хотите закрыть, сделайте это. Я оставлю его открытым для дальнейшего обсуждения.

Ответ 1

Конструкция переключателя легче перевести в таблицу (или ветку). Это может сделать операторы switch более эффективными, чем if-else, когда метки меток находятся близко друг к другу. Идея состоит в том, чтобы последовательно добавить кучу инструкций перехода в память, а затем добавить значение в счетчик программ. Это заменяет последовательность инструкций сравнения с операцией add.

Ниже приведены некоторые чрезвычайно упрощенные примеры сборки psuedo. Во-первых, версия if-else:

    // C version
    if (1 == value)
        function1();
    else if (2 == value)
        function2();
    else if (3 == value)
        function3();

    // assembly version
    compare value, 1
    jump if zero label1
    compare value, 2
    jump if zero label2
    compare value, 3
    jump if zero label3
label1:
    call function1
label2:
    call function2
label3:
    call function3

Следующая версия коммутатора:

    // C version
    switch (value) {
    case 1: function1(); break;
    case 2: function2(); break;
    case 3: function3(); break;
    }

    // assembly version
    add program_counter, value
    call function1
    call function2
    call function3

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

Ответ 2

Коммутатор может быть оптимизирован путем компиляции r - вы получите более быстрый код.
Также я считаю, что это более элегантно при работе с перечислимыми типами.

Подводя итог оператора switch, вы получаете производительность + элегантность кода:)

Вот несколько полезных ссылок:

Ответ 3

Для выразительности оператор switch/case позволяет группировать несколько случаев вместе, например:

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;

Для производительности компиляторы иногда могут оптимизировать операторы switch в таблицах переходов.

Ответ 4

Я игнорирую этот тип низкоуровневой оптимизации, как обычно неважный, и, вероятно, отличается от компилятора компилятором.

Я бы сказал, что основное отличие - читаемость. если /else очень гибко, но когда вы видите коммутатор, вы сразу знаете, что все тесты относятся к одному и тому же выражению.

Ответ 5

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

enum Color { Red, Green, Blue }; 

Color c = Color.Red;

switch (c) // Switch on the enum

{

// no casting and no need to understand what int value it is

case Color.Red:    break;
case Color.Green:  break;
case Color.Blue:   break;

}

Ответ 6

Возможность провалиться через несколько случаев (намеренно исключая выражение о нарушении) может быть полезна, и, как уже говорилось, несколько человек говорят об этом быстрее. Возможно, самое важное и наименее важное соображение заключается в том, что он просто делает код более красивый, чем if/else.:)

Ответ 7

Переключатель может быть оптимизирован "Лучше" некоторыми компиляторами. Есть ловушки с использованием оператора switch на определенных языках. В Java коммутатор не может обрабатывать строки, а в VB2005 оператор switch не будет работать с переключателями.
Переключатель может быть быстрее и легче читать, If-Then более общий и будет работать в большем количестве мест.

Ответ 8

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

Случай для Javascript, который компилируется для сборки для выполнения на большинстве движков, включая движок Chrome V8, заключается в том, что операторы switch на 30% -60% медленнее выполнять в общем случае: http://jsperf.com/switch-if-else/20