· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Запутался в loop'ах :(((

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Июн 10, 2004 20:33:39

Чего-то у мя башка сегодня совсем плохо с утра соображает :(((
Блин. Значит так, имеем цикл:

for(i = 0; i < 100; i++)
{
//делаем чего-нибудь
}

Надо раскрутить на цикл с постусловием.
Делаем так:

i = ???
do
{
//делаем чего-нибудь
}while(i--);

Это аналог? И как бы мне в бесконечный цикл не свалится, ведь проверка-то только на ноль. Может, надо на >= 0? Блииин...


Дата: Июн 10, 2004 20:40:35 · Поправил: Funbit

ну если во втором случае i = 101
то тоже самое (только внутри i-1 надо будет использовать)

т.е. 101-i :)


Дата: Июн 10, 2004 20:44:49

Не понял! Клинит меня!
Ведь, скажем, если i используется в качестве индекса в массиве, то надо, вероятно так:
i = 100;
do
{

}while(i--);
Или нет?


Дата: Июн 10, 2004 20:47:29

А как на счет:

i = 100;
do
{

}while(--i);


Дата: Июн 10, 2004 20:50:14 · Поправил: Funbit

я тоже туплю, кто с утра, кто к вечеру :)

твой вариант не совсем верный, т.к. нулевой элемент он не обработает. когда i будет равно 1 - цикл завершится.

нужно (i--)>=0

на счет оптимизации не знаю, надо компиленый вариант смотреть


Дата: Июн 10, 2004 20:51:17

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

А вообще... Зачем эти преобразования делать вручную? Такое умеют делать даже слабые оптимизаторы. Ты вот и сам относительно недавно цитировал бинарники линукса для крутых. Там было именно это...


Дата: Июн 10, 2004 20:53:04 · Поправил: Funbit

гы, выполнит :)
короче

i = 99;
do
{

}while(i--);


Дата: Июн 10, 2004 21:00:40 · Поправил: volodya

Funbit
#include <stdio.h>
#include <stdlib.h>

void main()
{
	int i = 0;
	char arr[10];
	
	for(; i < 10; i++)
	{
		arr[i] = i;
		printf("%u\n", arr[i]);
	}

	i = 9;
	do
	{
		arr[i] = i;
		printf("%u\n", arr[i]);
	}while(i--);
}


Короче, но я не понимаю, почему 9 :((((

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

А это я и так знаю. Я почему "9" не понимаю :(((


Дата: Июн 10, 2004 21:03:14

потому что цикл с for имеет условие

for(i = 0; i < 100; i++)

последний элемент будет 99,
когда i будет == 100, выход.

ну а do надо с 99ти начинать,
если хочется точно такой же цикл.

а еще можно не с 99ти :)

i = 0;
do {
//do smth
} while ((++i)<100);


Дата: Июн 10, 2004 21:04:27

Вот теперь понял :) Спасибо :)
А тот цикл, что ты последним написал - это попса, т.к. счетчик должен декреметироваться - тогда с нулем будет сравниваться, что короче.
Спасибо!


Дата: Июн 10, 2004 21:05:30

while(i=100;i>=0;i--)
{
}
Это будет выполнено 101 раз.

Если я понял правильно.
Если не правильно понял - объясните по русски что нужно.
Т.е. делать пока на конце блока (постусловие?) не будет то то при этом i используется и должно на каждом цикле (инкриминироваться:декриминироваться?)


Дата: Июн 10, 2004 21:08:24

Я хотел быстрый цикл с постусловием, чтобы он был точным аналогом того for, что я написал в начале. Проблема решена. Да ее бы и не было изначально, если бы у мя башка варила.


Дата: Июн 10, 2004 21:09:28

нормальный компилятор всегда транслирует for в цикл с пост-условием.
счетчик (если у тебя действительно чиста счетчик) лучше сделать стремящимся к нулю, естественно, что при i-- кол-во итераций на одну больше, чем при --i. или можно сказать, что при --i кол-во итераций на одну меньше ;)


Дата: Июн 10, 2004 21:13:40

Да, у мя действительно чиста счетчик :)
		do
		{
			if (u_ptr[bait].hash == bobject[i].hash)
			{
				bait_index = i;
				break;
			}
		}while(i--);


Дата: Июн 10, 2004 21:37:29

Уж проще в асм листинге было бы разобраться чем в этом C'шном ;-)

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.112