Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
ВнизFOR or WHILE Найти похожие ветки
← →
vasIZmax © (2007-03-12 14:27) [0]
Почему везде вместо цикла for используется цикл while?
Причиной тому некоторые особенности реализации цикла for в Delphi. В языке AlgoPascal если цикл не выполнялся не разу, то управляющая переменная цикла содержит стартовое значение. В Delphi если цикл не выполнялся не разу, то управляющая переменная цикла не изменяется. Однажды я встретил исходник, в котором эта разница играла большую роль, и решил заменить цикл for в программах на Delphi циклом while, который полностью совпадает по своему поведению с циклом в AlgoPascal.
До сегодняшнего дня всегда использовал for для циклов, и редко while и repeat(в основном когда надо было step не 1, а n).
Вот сейчас надо прогу написать (различные виды сортировок), ну я к гуглу, чтобы найти инфу по сортировка (сами алгоритмы) и попался мне выше указанный абзац.
В самом деле лучше использовать WHILE вместо FOR?
Сильно ли это сказывается на временных затратах работы программы?
ЗЫ. извините, если баян))
ЗЫЫ. абзац взят с http://alglib.sources.ru/faq.php#q6
← →
tesseract © (2007-03-12 14:30) [1]
> Причиной тому некоторые особенности реализации цикла for
> в Delphi
Смотри описание стандартов языков - там чёрным по белому написано, что значение переменной цикла после выхода из цикла не определено.
Поведение цикла до BDS 2006 и после отличаеться.
← →
Думкин © (2007-03-12 14:30) [2]Условие while будет считаться на каждой интерации, для FOR это не так. Уже сколько веток было на эту тему.
← →
Gero © (2007-03-12 14:31) [3]> Почему везде вместо цикла for используется цикл while?
Почему автор сего сабжа каждый день пьет одеколон?
← →
Думкин © (2007-03-12 14:33) [4]По ссылке:
Массивы в Delphi начинают нумерацию элементов с ноля.
← →
Kolan © (2007-03-12 14:36) [5]> [4] Думкин © (12.03.07 14:33)
> По ссылке:
>
> Массивы в Delphi начинают нумерацию элементов с ноля.
Чтоже будет когда он увидетA: array [100..110] of Integer;
> Почему автор сего сабжа каждый день пьет одеколон?
Вместо красной икры булку ситную, он намажет помадой губной (с)
← →
Аноним (2007-03-12 14:42) [6]
> Однажды я встретил исходник, в котором эта разница играла
> большую роль
В топку такой исходник.
> и решил заменить цикл for в программах на Delphi циклом
> while
гениально.
← →
Сергей М. © (2007-03-12 14:46) [7]
> Сильно ли это сказывается на временных затратах работы программы?
>
Для разработчиков софта, никак не связанного с пуском ракет с ядерным зарядом на борту - "не сильно")
← →
vasIZmax © (2007-03-12 14:49) [8]все-то понятно, не понятно одно: "что лучше?"
for - если знаю сколько надо итераций,
while - не знаю, но при каких-то условиях прервать работу цикла.
что быстрее будет работать? или это конкретно зависит от ТЗ?
> Почему везде вместо цикла for используется цикл while?
ребят, ну это ж из текста выдрано, поэтому смысл и теряется)))
ЗЫ. ссылка указана, чисто для того чтобы не думали, что с пионерил, или сам придумал сие))
ЗЫЫ. на крайний случай - удалите тему)))
← →
vasIZmax © (2007-03-12 14:53) [9]
> Сергей М. © (12.03.07 14:46) [7]
Понимаете надо провести анализ сортировок, и здесь миллисекунды так сказать играют роль))), а из-за "корявости" кода, будут сделаны неправильные выводы о скорости сортировки. (хотя большинству будет пофик на это).
ЗЫ. для меня это важно
← →
MBo © (2007-03-12 14:57) [10]Если по логике for, то его и надо использовать, будет чуть быстрее.
А что за сортировки надо сравнивать?
← →
Сергей М. © (2007-03-12 14:58) [11]
> vasIZmax © (12.03.07 14:53) [9]
Здесь надо понимать, какой конкретно код генерирует оптимизирующий компилятор (в т.ч. и в п.о.) для while- и for-конструкций, в каждом конкретном случае. Без этого дальнейший разговор лишен смысла.
← →
TUser © (2007-03-12 15:03) [12]Заменяй на if ... then goto ... - так и Delphi, и любой другой компилятор должен понять одинаково :)
← →
Ega23 © (2007-03-12 15:05) [13]Насколько я понимаю, while - это вырожденный for. Только в while каждый раз будет вычисляться условие.
Блин. Даже не знаю как в двух словах объяснить. Нормализация БД с назначением в качестве ключа строкового поля в качестве примера в бошку лезет...
← →
vasIZmax © (2007-03-12 15:07) [14]
> MBo © (12.03.07 14:57) [10]
э-э-э... мне сказал (препод) "все которые сможешь найти". ну вика конечно дала пищи для раздумий
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8
> Сергей М. © (12.03.07 14:58) [11]
я это уже понял)).
Просто меня несколько смутило (я ж говорю чаще всего использую for, и оч редко while) высказывание приведенное в абзаце, вот я и спросил.
← →
Ega23 © (2007-03-12 15:09) [15]
> Просто меня несколько смутило (я ж говорю чаще всего использую
> for, и оч редко while) высказывание приведенное в абзаце,
> вот я и спросил.
А я кроме как While not Eof больше нигде и не пользую.
Ну кроме TSQL, конечно... :)
← →
DrPass © (2007-03-12 15:12) [16]
> Насколько я понимаю, while - это вырожденный for
Вообще-то скорее наоборот :)
> Здесь надо понимать, какой конкретно код генерирует оптимизирующий
> компилятор
Для for, насколько я знаю, во всех Паскалевских компиляторах результат будет одинаковый: без оптимизации - add/cmp/jle с переменной, с оптимизацией - dec/jz с регистром.
Ну а while, естессно, суть более хитрая конструкция, так что for в любом случае будет или чуть быстрее, или хотя бы таков же по быстродействию
← →
Плохиш © (2007-03-12 15:12) [17]Всем, спасибо. Настроение после обеда подняли :-))
← →
Сергей М. © (2007-03-12 15:14) [18]
> vasIZmax © (12.03.07 15:07) [14]
> меня несколько смутило
И правильно смутило. Потому что там дурь несусветная.
Как говорит ИШ, "всякий овощ должен быть употреблен ..." (и т.д. и т.п.)
Там где очевиден for - надо применять for
Там где очевиден while - надо применять while
Там где ничерта не очевидно, надо бросать давить на кнопки и углубиться в чтение спецлитературы.
← →
Ega23 © (2007-03-12 15:15) [19]
> Вообще-то скорее наоборот :)
Это смотря с какой стороны смотреть... :)
← →
DiamondShark © (2007-03-12 15:17) [20]
> В Delphi если цикл не выполнялся не разу, то управляющая
> переменная цикла не изменяется
В дельфи, а равно как и в паскале вообще со времён его появления управляющая переменная после цикла имеет неопределённое значение, не зависимо от того, сколько раз выполнялся цикл.
> ЗЫ. извините, если баян))
Не извиним, бо не боян, а мегабоянище.
Всех паскальщиков с первого класса школы фигачат носом об доску: "Не используй, сцуко, переменную цикла после цикла".
← →
vasIZmax © (2007-03-12 15:28) [21]
> Ega23 © (12.03.07 15:09) [15]
во-во. та же ситуация:)
> DrPass © (12.03.07 15:12) [16]
по крайней мере, хуже (в смысле затрат времени) не будет, я ничего не теряю используя for.
> DiamondShark © (12.03.07 15:17) [20]
> Всех паскальщиков с первого класса школы
да вот как-то не приходилось, мне учиться в такой школе(не вышло, не сложилось вот как-то, а очень хотелось), а теперь тупые вопросы задаю.
← →
DiamondShark © (2007-03-12 15:32) [22]
> да вот как-то не приходилось, мне учиться в такой школе(не
> вышло, не сложилось вот как-то, а очень хотелось), а теперь
> тупые вопросы задаю.
Это не проблема.
На этот случай Дельфи в коде вроде такого
for i := 0 to 10 do writeln(i);
writeln(i);
на второй строчке выдаёт варнинг:
[Warning] Unit1.pas(31): FOR-Loop variable "i" may be undefined after loop
Читать-то стопудово все умеют.
← →
vasIZmax © (2007-03-12 15:37) [23]
> DiamondShark © (12.03.07 15:32) [22]
да, мне не надо использовать переменную-счетчик после цикла:).
мне скорость главное! что быстрее for или while? благо ответы получены)
← →
MBo © (2007-03-12 15:40) [24]>э-э-э... мне сказал (препод) "все которые сможешь найти
Так задача-то в чем? Для популярных сортировок известны асимптотики, и примерное соотношение скоростей в каждом асимптотическом классе.
Например, для O(n^2)
Insertion<Selection<Shaker/Bubble, хотя первая и последняя - адаптивные, скорость зависит от изначальной упорядоченности (количества инверсий).
← →
vasIZmax © (2007-03-12 15:51) [25]
> MBo © (12.03.07 15:40) [24]
да вот хотелось сравнить "придуманное" (придуманное ли? это сейчас и выясняю) с имеющимися.
на счет "вставок" и "пузырька" Вы правы.
← →
Vlad Oshin © (2007-03-12 15:53) [26]for i := 0 to 10 do ;
mov al,$0b
dec al
jnz -$04
repeat inc(i); until i>10;
add al,$01
jnb +$05
call @IntOver
cmp al,$0a
jbe -$0d
while i<10 do inc(i);
add al,$01
jnb +$05
call @IntOver
cmp al,$0a
jb -$0d
судя по всему, for будет побыстрее
← →
Чапаев © (2007-03-12 16:23) [27]> Однажды я встретил исходник, в котором эта разница играла
> большую роль
Нашёл, блин, чем похвастаться...
> все-то понятно, не понятно одно: "что лучше?"
Лучше пивка попить.
> Там где очевиден for - надо применять for
> Там где очевиден while - надо применять while
> Там где ничерта не очевидно, надо бросать давить на кнопки
> и углубиться в чтение спецлитературы.
А в каком случае голову подключать? %-)
> на второй строчке выдаёт варнинг:
> [Warning] Unit1.pas(31): FOR-Loop variable "i" may be undefined
> after loop
> Читать-то стопудово все умеют.
Настоящие кулхацкеры при виде варнингов и хинтов стискивают зубы и ругают Паскаль. :-D
> [26] Vlad Oshin © (12.03.07 15:53)
А если range check отключить? А вообще у меня BDS2006 "малость" другой код сгенерила. Что удивило, на пустых циклах компилятор мухлюет, из цикла с предусловием сделал цикл с постусловием.
Для программкиfor I := 0 to 10 do
WriteLn(I);
I:=0;
while I<=10 do begin
WriteLn(I);
Inc(I);
end;
I:=0;
repeat
WriteLn(I);
Inc(I);
until I>10;
код для всех трёх циклов был сгенерирован почти одинаковый. Все три цикла стали циклами с постусловием. В цикле с параметром условие проверялось по jnz, в остальных -- по jle.
← →
Anatoly Podgoretsky © (2007-03-12 22:42) [28]> vasIZmax (12.03.2007 15:37:23) [23]
У тебя секундомера нет?
← →
Нечитатель (2007-03-13 00:53) [29]Сравнение *алгоритмов* - вещь туманная.
Для одного и того же алгоритма несуществнные с точки зрения логики изменения кода могут дать прирост скорости примерно 20%.
И как тут сравнивать, если простая замена i на j может так повлиять?
Или скажем для рекурсивных сортировок количество параметров, передаваемых через стек, может оказывать большее влияние на скорость, чем внутренние детали процедуры.
← →
Германн © (2007-03-13 01:10) [30]
> Ega23 © (12.03.07 15:09) [15]
>
...
> А я кроме как While not Eof больше нигде и не пользую.
> Ну кроме TSQL, конечно... :)
>
АRepeat
часто используешь?
← →
J_f_S (2007-03-13 14:21) [31]Опять??
С полгодика назад знатнейшая буча была.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.033 c