Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Что большее зло: 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.074 c
2-1275547550
My__Nick__Name
2010-06-03 10:45
2010.08.27
Unicode в Open Office 3


2-1272489700
yagluboko
2010-04-29 01:21
2010.08.27
ошибка периода компиляции


15-1275342967
Германн
2010-06-01 01:56
2010.08.27
А тут ещё и глюки!


2-1265977110
Начинающий__
2010-02-12 15:18
2010.08.27
Подстрока в строке


15-1267479001
Юрий
2010-03-02 00:30
2010.08.27
С днем рождения ! 2 марта 2010 вторник