Позвольте мне переписать этот код для вас, возможно, это сделает его более очевидным. Следующий код является более или менее эквивалентно тому, который разместил:
if (n == 1) goto ONE;
if (n == 2) goto TWO;
if (n == 3) goto THREE;
if (n == 4) goto FOUR;
if (n == 5) goto FIVE;
goto SKIP_ALL;
while (true) {
ONE:
// do some things
if (some condition) goto go_on;
TWO:
// do some things
if (some condition) goto go_on;
THREE:
// do some things
if (some condition) goto go_on;
}
while (true) {
FOUR:
// do some things
if (some condition) goto go_on;
FIVE:
// do some things
if (some condition) goto go_on;
}
SKIP_ALL:
go_on:
петли внутри коммутатора, они не вызывают переключение происходить чаще. Коммутатор в основном решает, в какой цикл скачкообразно сканируется программа, и при которой начинается инструкция в этом цикле. Как только он прыгнул туда, петли продолжаются нормально. Также обратите внимание, что коммутатор обычно быстрее всех операторов if
.
И нет, goto - неплохой дизайн в целом. A switch
- всего лишь переход, а переключатель - неплохой дизайн. В действительности, почти каждая ветвь кода внутри функции/метода, выполняемая на процессоре или внутри виртуальной машины, представляет собой простой переход (иногда условный, иногда нет). Это просто, что goto является самым примитивным, низкоуровневым способом ветвления и мало информирует читателя о намерении. Всякий раз, когда есть более высокий уровень, тот, который делает ваше намерение более очевидным, предпочтительнее использовать его. Использование goto - это всего лишь плохая конструкция, если бы вы могли легко написать такой же код без использования goto, и это было бы не намного хуже. В некоторых (хотя и очень редких) случаях goto почти неизбежен или любая попытка избежать этого создает уродливый, нечитаемый, очень сложный код или очень плохую производительность в результате.
Эссе «goto считается вредным» происходит от времени, когда некоторые люди использовали goto для всего: для if/else ветвей кода, для циклов, для коммутаторов, для выхода из циклов/переключателей, чтобы избежать рекурсии, и т. д. И если вы злоупотребляете подобным образом, и если вы делаете что-то вроде прыжка на ярлык, который сразу же перескакивает на другой ярлык, люди теряют обзор. Код, подобный этому, нечитабелен и чрезвычайно трудно отлаживать. Вот как вы пишете код сборки, но это не должно быть способом написания кода C.
Похож на вариант [Устройство Даффа] (https://en.wikipedia.org/wiki/Duff's_device). Здесь есть объяснение (https://stackoverflow.com/questions/514118/how-does-duffs-device-work). – tangrs
Подумайте о выражениях 'case' как меток с' switch' как 'goto'. – chux
Это своего рода техника разворачивания петли. подумайте о конце цикла. – Alex