Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизЧто большее зло: goto или while true do ? Найти похожие ветки
← →
Дмитрий С © (2010-05-12 09:24) [0]Subj. И то и то обычно считается злом, но что хуже/лучше и почему? И вообще откуда это взялось?
← →
RWolf © (2010-05-12 09:40) [1]из статьи Дейкстры «О вреде оператора GOTO».
← →
Dimka Maslov © (2010-05-12 09:40) [2]Из-за отсутствия "цикла c выходом посередине"
← →
Ega23 © (2010-05-12 09:47) [3]
> И то и то обычно считается злом
Почему?
Ну с goto я ещё как-то могу понять, но почему while true?
← →
icWasya © (2010-05-12 09:50) [4]Не плыви по течению, не плыви против течения - плыви туда, куда тебе нужно.©
← →
RWolf © (2010-05-12 09:51) [5]
> Ну с goto я ещё как-то могу понять, но почему while true?
считается, что, если в тексте программы не практикуется выход из циклов через Break и т. п., такой код читать легче.
← →
boriskb © (2010-05-12 10:07) [6]
> Ega23 © (12.05.10 09:47) [3]
>Почему?
Насколько я помню, это идет из теории программирования. А именно - доказательства безошибочности алгоритма.
С указанными конструкциями доказать невозможно, без них возможно.
P.S.
Если паять меня подвела - старшие товарищи меня поправят :))
← →
12 © (2010-05-12 10:13) [7]откуда пошло - Э.Дейкстра “Go To Statement Considered Harmful”
Goto обычно можно переписать
<инициализация цикла>
WHILE <условие ограничения поиска> AND (<условие окончания поиска>) DO
END WHILE
проблема, имхо, в искусственности приема
писать надо
<инициализация цикла>
<условие ограничения поиска>
<условие окончания поиска>
причем <инициализация цикла> обычно дублирует <условие ограничения поиска> и/или <условие окончания поиска>
следовательно, исправив в одном месте, приходится исправлять и в другом
Ученик спросил Учителя:
- Учитель, плыть ли мне по жизни по течению или же против течения?
- Плыви туда, куда тебе надо.
← →
Игорь Шевченко © (2010-05-12 10:18) [8]boriskb © (12.05.10 10:07) [6]
> Насколько я помню, это идет из теории программирования.
> А именно - доказательства безошибочности алгоритма.
> С указанными конструкциями доказать невозможно, без них
> возможно.
Да, именно так. А про читаемость и проч. уже последователи пророка придумали, чтобы количество правоверных увеличивать.
← →
RWolf © (2010-05-12 10:42) [9]и что, действительно можно доказать безошибочность?
тогда почему этого до сих пор не делают компиляторы?
← →
Leonid Troyanovsky © (2010-05-12 10:51) [10]
> boriskb © (12.05.10 10:07) [6]
> А именно - доказательства безошибочности алгоритма.
Наверное, конечности времени работы, или отсутствия зацикливания.
Кста, ЕМНИП, ссылки вперед допустимы.
--
Regards, LVT.
← →
Игорь Шевченко © (2010-05-12 10:52) [11]RWolf © (12.05.10 10:42) [9]
> и что, действительно можно доказать безошибочность?
как все запущено...можно
← →
Юрий Зотов © (2010-05-12 11:06) [12]> RWolf © (12.05.10 10:42) [9]
Насколько я понимаю, компиляторы именно это и делают, в той или иной степени. Но безошибочность алгоритма еще не означает безошибочности программы.
← →
Mystic © (2010-05-12 11:10) [13]Имхо, зло это бездумное следование догмам :)
Кстати, в Ada даже есть специальная конструкция для бесконечного цикла:
loop
// ...
end loop;
Лично я большой сторонник бесконечных циклов, что делает код проще модифицируемым и однотипным.
Ну а goto в умеренных количествах использовать можно. Если имеется нетривиальная алгоритмическая логика, то вряд ли использование кучи флагов для организации нужного goto вряд ли делает код понятнее :)
← →
Mystic © (2010-05-12 11:15) [14]> и что, действительно можно доказать безошибочность?
Смотри в сторону функциональных языков (типа Haskell), там это иногда используется. Проблемы с доказательством больше создает императивность языка :)
← →
Ega23 © (2010-05-12 11:18) [15]
loop
// ...
end loop;
Такое и Visual Basic вроде как есть.
← →
Суслик__ (2010-05-12 11:47) [16]я использую иногда и то и другое.
не вижу проблем.
← →
Palladin © (2010-05-12 11:56) [17]Суслик походу и второй пароль забыл )
← →
brother © (2010-05-12 12:00) [18]> Суслик походу и второй пароль забыл )
почему?
← →
Palladin © (2010-05-12 12:01) [19]уже два прочерка в конце ника
← →
brother © (2010-05-12 12:06) [20]так он не зарегеный, там пасов же нет?
← →
Anatoly Podgoretsky © (2010-05-12 12:09) [21]> Mystic (12.05.2010 11:10:13) [13]
loop = while true
← →
Anatoly Podgoretsky © (2010-05-12 12:09) [22]> Palladin (12.05.2010 11:56:17) [17]
Ты Суслика видишь, а он есть.
← →
brother © (2010-05-12 12:11) [23]> Ты Суслика видишь
я вижу - набор байт...
← →
Anatoly Podgoretsky © (2010-05-12 12:11) [24]> Palladin (12.05.2010 12:01:19) [19]
Надо звездочки рисовать, как на самолетах.
← →
Плохиш © (2010-05-12 12:17) [25]
> И то и то обычно считается злом, но что хуже/лучше и почему?
Когда коту делать нечего он яйца чешет.
← →
Mystic © (2010-05-12 12:22) [26]> loop = while true
В Ada такой синтаксис:
loop while I >= 0
I := I - 1;
end loop;
просто while необязателен.
← →
oxffff © (2010-05-12 12:25) [27]Отладчик в D2010 не хочет останавливаться на строчке
while TRUE do <- Здесь не брякается
..........
end
← →
oxffff © (2010-05-12 12:28) [28]Вот кусок моего кода
while TRUE do
case PascalLRAnalizer.DoOnSymbol(PASCAL_GRAMMAR.FinalTerminal,nil,0) of
STATUS_CONTINUE:;
STATUS_PASS:break;
....
end
except
end;
Брякается только на строчке case в 2010, поскольку условие не проверяется. Оно вроде и понятно, но как то неудобно.
← →
Anatoly Podgoretsky © (2010-05-12 15:16) [29]> oxffff (12.05.2010 12:25:27) [27]
do перенесил на другую строку.
← →
Игорь Шевченко © (2010-05-12 15:43) [30]oxffff © (12.05.10 12:28) [28]
> case PascalLRAnalizer
Англичане пишут Analyser
← →
oxffff © (2010-05-12 15:55) [31]
> Игорь Шевченко © (12.05.10 15:43) [30]
> oxffff © (12.05.10 12:28) [28]
>
>
> > case PascalLRAnalizer
>
>
> Англичане пишут Analyser
Исправил. :)
← →
Mystic © (2010-05-12 18:11) [32]> Англичане пишут Analyser
Ага, и colour.
← →
Mystic © (2010-05-12 18:16) [33]Кстати, вместо while true do всегда упорно пишу repeat until False;
И сейчас задумался, какую бы константу в своем модуля объявить для значения False?
например,
const
Apocalypto = False;
repeat
// ..
until Apocalypto;
Есть выражение "до нових вiникiв", но как-то писать
repeat
// ...
until NewBroom;
не звучит... until TurningBlue?
← →
turbouser © (2010-05-12 18:31) [34]
> Mystic © (12.05.10 18:16) [33]
until MorkovkinoZagovenie
← →
Игорь Шевченко © (2010-05-12 18:34) [35]
> например,
>
>
> const
> Apocalypto = False;
>
> repeat
> // ..
> until Apocalypto;
кандидат на увольнение :)
← →
Дмитрий С © (2010-05-12 19:04) [36]лингва подсказывает:
until further_orders
until it_comes_to_the_push
Особенно понравилось:
until hell_freezes_over
← →
_Юрий © (2010-05-12 20:46) [37]until CancerWhistleOnHill ?
← →
[true]TRIx © (2010-05-12 21:14) [38]while true do это же круто! как писать, если надо зациклить выполение?
← →
Petr V. Abramov © (2010-05-12 22:53) [39]
> Mystic © (12.05.10 12:22) [26]
> loop
> // ...
> end loop;
ага, а в PL/SQL (про который честно сказано, что он несколько содран с ada)
есть
loop
// do smth
exit when условие
// do smth
end loop
в зависимости от того, где поставить exit when, получаем while ... do, repeat ... until и на что фантазии хватит.
← →
GrayFace © (2010-05-13 08:35) [40]И то, и другое - добро.
Mystic © (12.05.10 11:10) [13]
Ну а goto в умеренных количествах использовать можно. Если имеется нетривиальная алгоритмическая логика, то вряд ли использование кучи флагов для организации нужного goto вряд ли делает код понятнее :)
Слабо представляю такую логику.
Mystic © (12.05.10 18:16) [33]
Лучшеconst
True = False;
repeat
until True;
while true do читается гораздо проще, чем двойное отрицание в until false.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.069 c