Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: академичность и цикл for.  (Прочитано 7098 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NeilPryde
Гость
« : 30-09-2004 08:41 » 

В теме "мина замедленного действия", dimka написал, что: «для полной академической чистоты цикл for вообще использовать вредно». Посему поэтому, хотелось бы знать, в чем заключается не академичность циклов for и академичность циклов while?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-09-2004 09:58 » 

насчёт вредности - это, конечно, шутка Улыбаюсь.

Просто FOR (в классическом виде) - это частный случай WHILE (со счётчиком итераций и автоматической инициализацией, где в качестве условия выхода полагается достижение счётчиком определённого значения). Т.е. логически его можно считать макросом, надстроенным над WHILE, поэтому отдельной теории для циклов вида FOR нет - для формального доказательства корректности алгоритма всякий FOR преобразуется в WHILE.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 30-09-2004 22:05 » 

если не ошибаюсь в asm'e так же нет for а есть loop, что то типа while  :?
вот их разновидности
loop
loope
loopz
loopne
loopnz
обработка счетчика ведется через регистры ecx/cx
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-10-2004 06:29 » 

в принципе, даже всякий WHILE можно заменить на IF и GOTO. Только GOTO для использования человеком запрещён Улыбаюсь (из-за злоупотреблений). В старейших и простейших версиях BASIC циклы выглядели так:

a la WHILE:

<метка1> IF NOT <while-условие> THEN GOTO <метка2>
<тело цикла>
<метка...> GOTO <метка1>
<метка2> ...
[/code]

a la UNTIL:

<метка1> ...
<тело цикла>
<метка...> IF NOT <until-условие> THEN GOTO <метка1>

такие записи непосредственно преобразуются в ассемблер или машинный код, поэтому интерпретатор BASIC был прост и занимал очень мало памяти (что для объёма в 64 Кб было очень полезно)

перевод вышеприведённого в asm 8086 даст примерно следующее

WHILE:

label1:
<while-условие>
jne label2
<тело цикла>
jmp label1
label2:

UNTIL:

label1:
<тело цикла>
<until-условие>
jne label1
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #4 : 01-10-2004 10:35 » 

Все верно, но не надо забывать, что goto весьма быстрая операция, незря ею пестрит ядро Linux (хотя признаюсь сам я goto не использую)
Записан

С уважением Lapulya
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 01-10-2004 12:21 » 

lapulya, я и говорю: запрещён из-за злоупотреблений. При правильном использовании даже полезен. Скажем так, goto разрешён (академиками) лишь для компиляторов и прочих автоматов генерации кода (они не страдают невнимательностью), а также в программах, где критично быстродействие (например, ядро какой-нибудь ОС).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 01-10-2004 16:05 » 

Метод использования goto в ядре Linux-а не связан с оптимизацией быстродействия, а просто упрощает сишный код при наличии множества проверок с одной-двумя точками выхода. Иначе бы пришлось городить множество вложенных if-else и код стал бы запутанным.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Migmile
Помогающий

ru
Offline Offline

« Ответ #7 : 04-10-2004 12:11 » 

Рекомендация, а затем и правило не использовать GOTO появилось из-за желания не дать программисту совершить ошибку Улыбаюсь, равно как и многие другие "усовершенствования" языков и компиляторов. Человеку не всегда нравиться, когда за него думают и решают, что ему полезно, а что нет.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 04-10-2004 12:39 » 

GOTO скорее оптимизация по числу инструкций.  В c++ потребность в GOTO меньше, чем в С, благодаря автоматическому вызову деконструктора.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines