Почему Switch / Case, а не If / Else If? - PullRequest
60 голосов
/ 22 июня 2009

Этот вопрос в основном указывает на C / C ++, но я думаю, что другие языки также актуальны.

Я не могу понять, почему переключатель / регистр все еще используется вместо if / else if. Мне кажется, что это очень похоже на использование goto, и приводит к тому же типу грязного кода, в то время как те же результаты можно получить с if / else if гораздо более организованно.

Тем не менее, я вижу эти блоки вокруг довольно часто. Распространенное место для их поиска - рядом с циклом сообщений (WndProc ...), в то время как они являются одними из тех мест, где они вызывают самый тяжелый хаос: переменные распределяются по всему блоку, даже когда они не принадлежат (и не могут инициализируется внутри него). Особое внимание должно быть уделено тому, чтобы не бросать перерывы, и так далее ...

Лично я не использую их, и мне интересно, пропускаю ли я что-то?

Являются ли они более эффективными, чем если бы / еще? Продолжаются ли они по традиции?

Ответы [ 15 ]

1 голос
/ 27 марта 2010

Корпус переключателя в основном используется для выбора в программировании. Это не относится к условному выражению как:

если вашей программе требуется только выбор, то почему вы используете блок if / else и увеличиваете объем программирования, а также снижаете скорость выполнения программы.

0 голосов
/ 03 августа 2010

Основной причиной этого является ремонтопригодность и удобочитаемость. С помощью оператора Switch / case легко сделать код более читабельным и понятным, чем if / else. Поскольку у вас много if / else, тогда код становится таким грязным, как nest, и его очень сложно поддерживать.

А у некоторых как время выполнения другая причина.

0 голосов
/ 22 июня 2009

Smalltalker может отклонить и switch, и if-then-else's и может написать что-то вроде: -

shortToLongDaysMap := Dictionary new.

shortToLongDaysMap
at: 'Mon'     put:  'Monday';
at: 'Tue'     put:  'Tuesday';
at: 'Wed'     put:  'Wednesday'
etc etc.

longForm := shortToLongDaysMap at: shortForm ifAbsent: [shortForm]

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

Обратите внимание, что второй аргумент at:IfAbsent: аналогичен предложению по умолчанию оператора case.

0 голосов
/ 22 июня 2009

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

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

0 голосов
/ 22 июня 2009

Я уверен, что они компилируются в те же вещи, что и if / else if, но я считаю, что switch / case легче читать, когда их больше 2 или 3 else с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...