При создании everthing с goto's легко (о чем свидетельствует f.ex.Il), мне было интересно, возможно ли также устранить все операторы goto с выражениями более высокого уровня и утверждениями - скажем - используя все, что поддерживается в Java.Можно ли всегда исключать goto?
Или, если хотите: то, что я ищу, это «переписать правила», которые всегда будут работать независимо от способа создания goto.
В основном это теоретический вопрос, чисто как интерес; а не как хорошие/плохие практики.
Очевидное решение, что я думал о том, чтобы использовать что-то вроде этого:
while (true)
{
switch (state) {
case [label]: // here's where all your goto's will be
state = [label];
continue;
default:
// here's the rest of the program.
}
}
Хотя это вероятно, будет работать и не соответствует моей «формальный» вопрос, мне не нравится мое решение одной немного. Во-первых, он мертв уродливым и для двоих, он в основном переводит goto в переключатель, который делает то же самое, что и goto.
Итак, есть ли лучшее решение?
Update 1
Так много людей, кажется, думают, что вопрос «слишком широк», я собираюсь разработать немного больше ... причину я уже упоминал Java является потому, что Java не имеет оператора 'goto'. Как один из моих проектов по хобби, я пытался преобразовать код C# в Java, что оказалось довольно сложным (отчасти из-за этого ограничения в Java).
Это заставило меня задуматься. Если у вас есть f.ex. реализация метода «remove» в Open address (см.: http://en.wikipedia.org/wiki/Open_addressing - примечание 1), довольно удобно иметь «goto» в исключительном случае, хотя в этом конкретном случае вы можете переписать его, введя переменную «state» , Обратите внимание, что это всего лишь один пример: я реализовал генераторы кода для продолжения, которые производят тонны и тонны goto, когда вы пытаетесь их декомпилировать.
Я также не уверен, что переписывание в этом вопросе всегда будет исключать утверждение 'goto' и если оно разрешено в каждом случае. Хотя я не ищу формального «доказательства», некоторые доказательства того, что устранение возможно в этом вопросе, были бы замечательными.
Так что о «широте» я бросаю вызов всем людям, которые думают, что есть «слишком много ответов» или «много способов переписать goto», чтобы обеспечить алгоритм или подход к переписанию общего случая, так как Единственный ответ, который я нашел, - это тот, который я опубликовал.
'goto' - это взломать, который может улучшить производительность в кромках (с практической точки зрения: токенизаторы, двигатели исполнения IL и ядра). В любом случае это никогда не подлежит замене. –
Знаете ли вы, что 'while',' for' и другие петлевые конструкции внутренне используют goto? Итак, вы хотите избежать использования циклов? Попытка избежать оператора switch не имеет смысла. Ну, вы можете реорганизовать коммутатор на использование полиморфизма, но он должен быть по крайней мере один. –
@SriramSakthivel Многие языки реализуют эти конструкции с помощью операторов перехода, но это не концептуальное требование; существуют и другие способы реализации этих конструкций, они просто не так широко используются в основных языках программирования. – Servy