Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цикл с двумя переменными? (https://javascript.ru/forum/misc/1522-cikl-s-dvumya-peremennymi.html)

SunYang 06.08.2008 18:19

Цикл с двумя переменными?
 
Здравствуйте.
Можно ли организовать цикл с двумя переменными, н-р

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

for (i=0, a=5; i<=20; a<10; i++; a=a+5) {...}
- возможна такая конструкция? Есть ли варианты это осуществить?

Спасибо.

Виталий 06.08.2008 18:25

for( var i=0, j=0 ; i < 10, j < 2 ; ++i, ++j ) {
alert( i + ' ' + j );
}

почему нет? все работает

Андрей Параничев 06.08.2008 18:28

for (var i=0, a=5; i<=20, a<10; i++, a+=5) {...}

Обратите внимание на очередность запятых и ";".

Виталий 06.08.2008 18:32

Андрей Параничев,
лучше бы ответил на 2 последних темы :))

NightmareZ 06.08.2008 23:15

Цитата:

Сообщение от SunYang (Сообщение 4232)
Здравствуйте.
Можно ли организовать цикл с двумя переменными, н-р

....

возможна такая конструкция? Есть ли варианты это осуществить?

Конечно такое возможно. Например, с помощью такой функции можно определить, является ли строка палиндромом:
function test(str)
{
	for (var i = 0, j = s.length - 1; i < j; i++, j--)
		if (str[i] != str[j])
			return false;

	return true;
}

Kolyaj 06.08.2008 23:19

Цитата:

Сообщение от Виталий
i < 10, j < 2

А знаете ли вы, как работает оператор "запятая"? Зачем ее вообще в условии писать? Хотя бы уж так: i < 10 && j < 2.

NightmareZ 06.08.2008 23:23

Цитата:

Сообщение от Kolyaj (Сообщение 4264)
А знаете ли вы, как работает оператор "запятая"? Зачем ее вообще в условии писать? Хотя бы уж так: i < 10 && j < 2.

Кстати, да, не заметил этого :)

Гуры яваскрипта, подскажите, запятая в js работает также, как в C++? Результатом будет последнее выражение в списке, т.е. в случае
i < 10, j < 2

результат выражения должен быть true, когда j < 2?

Андрей Параничев 06.08.2008 23:25

NightmareZ,
Именно так, как в си-подобных.
var i = 100;
var j = 5;
if(i < 50, j < 15) alert(1);


Я действительно не углядел условие i<=20, a<10.

SunYang 07.08.2008 00:47

Так как писать то? через запятую или &&?
типа for( var i=0 && j=0 ; i < 10 && j < 2 ; ++i && ++j ) {...} ??
Спасибо.

Андрей Параничев 07.08.2008 01:08

for (var i=0, a=5; i<=20 && a<10; i++, a+=5) {...}

NightmareZ 07.08.2008 01:29

Цитата:

Сообщение от SunYang (Сообщение 4271)
Так как писать то? через запятую или &&?
типа for( var i=0 && j=0 ; i < 10 && j < 2 ; ++i && ++j ) {...} ??
Спасибо.

Если ты пишешь несколько операторов (операндов, функций, etc.) через запятую, то они будут выполнены последовательно один за другим, а в качестве результата выражения будет возвращено значение последнего оператора.
Т.е., например:
1, 2, 3

равно трём,
true, false

равно false,
i < 10, j < 2

равно true тогда и только тогда, когда j < 2 (каково значение i - по барабану).

А бинарный оператор && выполняет операцию "И" над своими операндами и возвращает полученный результат.
Т.е., например,
true && true

равно true, а
true && false

равно false, кстати
false && true

тоже равно false.

Вот. Теперь по поводу инструкции for. В ней есть три секции, разделённые точкой с запятой.
В первой секции производится инициализация перед началом выполнения цикла. В твоём случае объявляем в нём несколько переменных. Никакое значение выражения в этой секции не используется. Посему, переменные можем определить через запятую.
Во второй секции пишется условие. Если оно истинно (true), цикл будет выолнять очередную итерацию. В противном случае - программа пойдёт выполнятся дальше (после блока операторов цикла). Т.к. тебе нужно проверить истинность нескольких условий, то разделить их нужно оператором &&.
Операторы (если есть) в третье секции исполняются каждый раз после очередной итерации цикла. Например, можно инкрементировать в ней переменные. Как и в первой секции, значение выражения не используется, нам нужно лишь выполнить подряд несколько операторов, посему перечисляем их через запятую.


Часовой пояс GMT +3, время: 10:02.