Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выражения в заголовке цикла 
:(
    Опции темы
Тутанхамец
Дата 12.5.2006, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Здравствуйте! smile 

Не очень представляю, как надо было назвать тему и куда ее поместить. 

Есть два вариант кода:

Код

for i=1 to len(s$)-1
DoSomething
next i


Код

n=len(s$)-1
for i=1 to n
DoSomething
next i


Пример на VB, но записать можно на любом языке. Я стараюсь писать по второму варианту, то есть так, чтобы при проверке условия не выполнялось много раз одна и та же операция. Вроде бы, по логике работы цикла for (что в Basic, что в Pascal, что в C) выражение считается каждый раз. 

Но замечаю, что некоторые кадры, которые понимают в программировании гораздо больше меня, часто пишут первый вариант. Может они знают что-то, чего я не знаю? Может, допустим, компиляторы что-нибудь оптимизируют?

В общем, вопрос: второй вариант действительно быстрее? 

Понимаю, что это зависит от языка. Пусть каждый скажет про тот язык, о котором знает. 

 
PM MAIL   Вверх
IvanB
Дата 12.5.2006, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



По моему скромному мнению вроде-как должен быть первый.

Цитата

Пример на VB, но записать можно на любом языке. Я стараюсь писать по второму варианту, то есть так, чтобы при проверке условия не выполнялось много раз одна и та же операция. Вроде бы, по логике работы цикла for (что в Basic, что в Pascal, что в C) выражение считается каждый раз. 

А она (операция) и так будет выполняться. Я как-то попробовал такую вещь на VB:
Код

Dim i As Integer, n As Integer
n = 6
i = 7
For n = 1 To n
 i = i + 1
Next n
MsgBox i

В результате выдаёт 13...... Это в VB 6.0..... В других языках такого не видел.

Т.е. получается, что значение переменной для сравнения в цикл передаётся один раз.
Вроде так.  

Это сообщение отредактировал(а) IvanB - 12.5.2006, 07:50
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
Тутанхамец
Дата 12.5.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Нда, Иван, действительно...

Проверил сейчас такую штуку. 

Код

Dim i As Long, n As Long
n = 100
For i = 1 To n
n = -1
Next i


Цикл все равно выполняется много раз. Удивлен. Такое чувство, что в досовских бейсиках было иначе. Помню ведь, что, когда я exit for не знал, выходил из цикла, присваивая n заведомо меньшее значение. 

В паскале (Делфи) та же штука. Пишет 10 и не зацикливается. 

Код

var i,n,h:integer;
begin
n:=10;
h:=0;
for i:=1 to n do begin
inc(n);inc(h); end;
showmessage(inttostr(h));


Для С++ проверить сейчас не могу, нет среды. Но, наверное, там то же самое. 

Был не прав smile Учту.

IvanB, спасибо. Мне что-то в голову не пришло, как проверить.  smile  
PM MAIL   Вверх
maxim1000
Дата 12.5.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Переместил из Алгоритмов
хотя сюда она тоже не очень подходит, но, как мне кажется, всё-таки ближе, чем алгоритмы... 


--------------------
qqq
PM WWW   Вверх
Void
Дата 14.5.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



VB и Pascal разобрали. По поводу C++ скажу, что тут все зависит от оптимизатора. Если параметры цикла изменяются внутри его тела, программа обязана использовать изменившиеся значения. Оптимизатор может вынести вычисление константных выражений из тела цикла. Так, в нижеприведенном коде MSVC 8.0 выполнил вынос во всех 4-х вариантах:
Код
#include <vector>

int main() {
    std::vector<int> a(10);
    int s = 0;
    for (int i = 0; i < a.size(); ++i)
        s += a[i];
    int length = a.size();
    for (int i = 0; i < length; ++i)
        s += a[i];
    for (std::vector<int>::const_iterator i = a.begin(); i != a.end(); ++i)
        s += *i;
    std::vector<int>::const_iterator end = a.end();
    for (std::vector<int>::const_iterator i = a.begin(); i != end; ++i)
        s += *i;
}


А вот в C# (и вообще .NET) может произойти интересная вещь: код с ручным выносом длины индексируемого массива может оказаться медленнее! Дело в том, что JIT работает достаточно шаблонно, и может распознать такой код и убрать рантайм проверки выхода за границы массива:
Код
for (int i = 0; i < a.Length; ++i)
    // a[i] used here

Но не распознать такой:
Код
int length = a.Length;
for (int i = 0; i < length; ++i)
    // a[i] used here


Вывод стандартный: Premature optimization is the root of all evil smile 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.