Это просто анархия получается. Если такое скомпилировать, то код может получиться неэффективным.
Такие приёмы обычно реализуются в языках, изначально ориентированных на интерпретацию. Например, в PHP можно вызывать функции по имени из переменной. В SOS Basic можно делать "GO TO n", где n - переменная, хранящая номер строки, к которой "GO". Правда, последнее черевато большими проблемами после автоматической перенумерации строк - как пить дать, поленится разбираться в Ваших формулах, вычисляющих адрес перехода
Goto вполне применим. Только конструкции типа if, while, for и др. всё же не зря придумали. В любом случае программу с goto можно преобразовать в форму из одних только циклов и ветвлений. К тому же оптимизация от использования сего оператора весьма сомнительна ввиду испоользования современных компиляторов.
if и for никто и не выбрасывает, это же основа структурного кода. А вот while при использовании goto забываешь как пишется. Соблазн goto в халявных ресурсах алгоритма при добавлении кода. Не нужно переделывать алгоритм, втавляй сколько хочешь без подробного изучения всего участка кода. Что происходит при выходе через goto из цикла или конструкции begin end и последующим в них возращением. Всё продолжает работать как если бы это был простой вызов процедуры. Сколько таких последовательных выходов компилятор способен запомнить?
Я всегда использую гото в процедуре считывания файла (в остальных случаях - очень редко). Пример (надуманный): надо считать файл. В нём имеются: числа икс и игрик - по одному байту (shortint), причёи оба должны быть по модулю не более 10. Далее - количество элементов некоторого массива (byte). Их не более чем 64. Далее - сами элементы. Причём все обязаны быть ненулевыми. Далее - число V (byte). Обязательно равно 128. Всё. Как я это бы реализовал:
... function Load(FileName: string): boolean; var i: integer; F: file of byte; label Bad; begin Assign(F, FileName); i := IOResult; Reset(F); if IOResult <> 0 then goto Bad; Read(F, X); if Abs(X) > 10 then goto Bad; Read(F, Y); if Abs(Y) > 10 then goto Bad; Read(F, Count); if Count > 64 then goto Bad; for i := 0 to Count - 1 do begin Read(F, A[i]); if A[i] = 0 then goto Bad; end; Read(F, V); if V <> 128 then goto Bad; Close(F); Load := True; Exit; Bad: Close(F); Load := False; end; ...
Это весьма примитивный случай. И никакого злоупотребления - всё очень логично и читабельно. Можно вместо гото писать begin Close(F); Load := False; Exit; end; - но это дольше. А как этот текст выглядит в виде брек-континь, я даже думать не хочу. Так что без гото здесь можно обойтись лишь теоретически.
А теперь реши эту задачку открывая файл как нетипизованный.
И поможет? Мы ж не знаем вообще сколько надо считать байтов. Всё, что надо читать мы узнаём по ходу дела... И какая разница, типизирован ли файл, не понимаю...
Смотря что считать помощью Просто по жизни пользуюсь нетипизированными файлами, там без гото крокодил не ловится. Интересно было взглянуть, насколько вырастет количество меток у независимого эксперта.
Вопрс можно? Спасибо. А jmp @label за goto считается? ;)
А если серьезно, использовал на Фортране из соображений совместимости с FORTRAN IV до тех пор, пока не стало ясно, что уже никогда не буду пользоваться компиляторами, не поддерживающими по крайней мере Fortran 77. Если же речь идет о Паскале, то, думаю, даже не вспомню, как синтаксически правильно описать метку.
Сам почти не пользуюсь, но мой препод говорит, что хороший программист отличается от плохого тем, что у плохого есть Label, а у хорошего нет! Сам я лично считаю, что именно в паскале это не так важно, ибо никакой уважающий себя программист в паскале ничего достойного писать не будет, а в смысле обучения хорошему стилю написания кода, так сказать для разминки, в самый раз, и никакие goto тут неприемлимы!!! klem4 суперрр картинка
Уважаемый, volvo, я не хотел Вас обидеть таковым отношением к паскалю, я высказал всего-лишь своё личное мнение, никому его не навязывая, никого не обзывая и не ущемляя достоинство других, и хотя я считаю, что обосновал своё именно такое отношение, не говоря при этом что-то плохое... Свободу слова по-моему никто не отменял, и правил форума я не нарушил... Вы можете занижать мою репутацию на форуме сколько хотите, но ничего этим не добъётесь, ибо я на нём зарегистрировался отнюдь не для повышения своей репутации и не для моего самоутверждения, а для своего усовершенствования, для того что бы в будущем стать достойным программистом, конечно же знающим и паскаль в том числе... Извините пожалуйста за сообщение не по теме!
Сообщение отредактировано: Yevgeny -
--------------------
"Брать производную можно научить даже обезьяну" - мой препод по матану! :-)
"Квалификация программиста обратна пропорциональна количеству операторов перехода, которые он использует в своих программах" - наш декан.. Я в принципе согласна..