|
Гость
|
|||||||||||||||||||||||||||||||
не использовать do/while ? бред !27.08.2007, 13:12. Показов 4542. Ответов 3
Метки нет (Все метки)
меня возмутила статья
http://www.cyberguru.ru/progra... age67.html в которой автор рекомендует вместо do {} while (); использовать while () {}; давайте же разберёмся что происходит на самом деле do { действия } while ( условие ); если это разложить по косточкам выходит следующее
while ( условие ) { действия }; разложим и это
p.s. если кто сомневается что он устроен именно так вспомните, что возможно while (действие перед каждой проверкой, проверка) { действие }; и ещё разсмотрим конструкцию if (условие) { do { } while (); }; которая особо не понравилась автору, что меня вообще добило хех
для do { } while ( ) ;
прошли при it == 1, проверили, прыгнули прошли при it == 2, проверили, прыгнули прошли при it == 3, проверили всё действий 4 проверок 4 прыжков 3 для while ( ) { };
проверили, прошли при it == 1 прыгнули проверили, прошли при it == 2 прыгнули проверили, прошли при it == 3 прыгнули проверили, прыгнули всё действий 4 проверок 5 прыжков 6 конструкция if (условие) { do { } while (); };
прошли при it == 0, проверили, прыгнули прошли при it == 1, проверили, прыгнули прошли при it == 2, проверили, прыгнули прошли при it == 3, проверили всё действий 4 проверок 5 прыжков 3 я считаю исходя из выше перечисленного что if (условие) { do { } while (); }; эффективнее while ( ) { }; и именно по этому заявление автора статьи меня так возмутило, он хоть бы попытался чем-то это аргументировать ... если я где-то ошибся прошу это указать, может я в чём-то и не прав |
|||||||||||||||||||||||||||||||
| 27.08.2007, 13:12 | |
|
Ответы с готовыми решениями:
3
Бред Бред с ГД
|
|
118 / 12 / 3
Регистрация: 21.08.2007
Сообщений: 222
|
|||||||||||||||||||||||
| 27.08.2007, 19:02 | |||||||||||||||||||||||
Теперь к делу:
Теперь конкретно ко времени исполнения программы(ну, предварительно, заставим исполняться этот код 10000000 раз):
Теперь мой вариант(результат тот же):
Что, касается цикла while, то всё вышесказанное применимо и к нему, т.к. его отличие лишь в том, что условие проверяется сразу => цикл может быть не выполнен ни разу. Что касается if () do {} while() - вообще глупо и неоптимально, т.к. сразу в таком коде
Резюмируя вышесказанное, применение цикла for() выгоднее в данных случаях и с точки зрения быстродействия, и с точки зрения удобочитаемости. Что касается статьи, то автор скорее всего хотел сказать, что в программировании нечасто встречаются ситуации, в которых использование циклов do-while является самым оптимальным решением. Но это не значит, что их нельзя использовать! P.S. Ну всё, что я тут нагородил, конечно, результат моих собственных изысканий и не является аксиомой.
0
|
|||||||||||||||||||||||
|
Гость
|
|||||||||||
| 28.08.2007, 00:11 | |||||||||||
|
да этот ответ меня действительно поразил на некоторое время, а именно проверка указанных тестов, спасибо
кстати it (0) это выполнение конструктора при инициализации, раз Вы пользуетесь компилятором gcc, то я могу сделать предположение что в C нету конструкторов из за отсутствия классов (если я не ошибаюсь) - далее я использую компилятор g++ 4.1.2 и чтож пусть будет it = 0, теперь к делу ) меня действительно поразило то, что указанные времена почти совпали, но я не мог понять как такое может быть, если цикл for это тот же while только с другим синтаксисом сразу замечу что зачастую я выбираю цикл while если ситуация того требует, а не if { do { } while (); }; , но если я пишу программу не спеша я её маниакально пытаюсь ускорить во времени но в любом случае в первую очередь - выше скорости стоит чёткая и стабильная робота программы, и я никогда бы не написал бы так
и ещё - в первом варианте инкремент i постфиксный, в другом префиксный, по моему мнению префиксный инкремент лучше - он быстрее и возвращает указатель, потому использую его затем мне бросилось в глаза вот что - после итераций в внутреннем цикле Вы не онуляете переменную i - ведь далее с её помощью будет попытка доступа к несуществующим элементам 5, 6, 7 .. 39999999 таким образом я внёс некоторые правки в код - я добавил скобки к (it < 4) а также добавил онуление i, изменил i++ на ++i и как - то более структурно записал всё, иначе для меня код просто нечитабельный
g++ sol.cpp -o sol && time ./sol = 0.23s g++ sol.cpp -o sol -D TEST && time ./sol = 0.20s хм... всётаки for медленнее ... чтоже так затормозило его ? скобки или онуление i ? ах да насчёт двойной проверки - это да, я просто хотел показать что условие копируется в обе части кода и работает структура так же как while я конечно не спорю что это всё не актуально при олимпиадном программировании, или при написании курсовых робот, но для больших проектов ... написанный код будет выполняться миллионы раз и экономия миллисекунды даст ведь о себе знать хехе снять розовые очки ?
|
|||||||||||
|
118 / 12 / 3
Регистрация: 21.08.2007
Сообщений: 222
|
||||||||||||
| 28.08.2007, 16:02 | ||||||||||||
for() действительно медленнее - но засчёт чего, мне стало очевидно только после анализа асемблерного листинга. Вся работа for( i = 0; i < 4 && (major[i] = 1); ++i) заключается в семи машинных командах:
0
|
||||||||||||
| 28.08.2007, 16:02 | |
|
Помогаю со студенческими работами здесь
4
какой то бред! бред в результате Бред Яндекса Яндекс-бред Что за бред? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|