Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.54 MB
Время: 0.071 c
15-1264109427
Юрий
2010-01-22 00:30
2010.08.27
С днем рождения ! 22 января 2010 пятница


2-1265990413
duMka
2010-02-12 19:00
2010.08.27
Библиотеки для работы с графикой.


15-1273860812
AKE
2010-05-14 22:13
2010.08.27
Согласитесь, что нехватает оператора типа a < x < b


2-1268475934
Grab3
2010-03-13 13:25
2010.08.27
ComboBox Видимое в списке и его значение


2-1275043106
kolian
2010-05-28 14:38
2010.08.27
запоминание и воспроизведение в окне memo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский