сontinue в for - страница 2

 

Нехорошо быть таким хвастунишкой, проказник! 

Да не, я спокоен. Мне приятно, что есть умные люди. И что их много вокруг меня.

 
Код просто для примера, написал что в голову пришло, интересен сам принцип работы continue в цикле for, касательно выражения 3, без относительно других нюансов. Реальный пример скину чуть позднее, если это действительно так важно и без этого никак.
 
EfremovSergey:
Код просто для примера, написал что в голову пришло, интересен сам принцип работы continue в цикле for

тогда нужно было сделать более наглядный пример, чтобы разобраться с оператором continue, я бы такой код писал:

void OnStart()
{
   for(int i = 0; i<10; i++)
   {
      if(i%3 == 0){ printf("continue , i = %d",i); continue; }  // i кратно 3
      printf("i = %d",i);
   }
}

2020.09.01 08:25:02.798 tst (EURUSD,H1) continue , i = 0

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 1

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 2

2020.09.01 08:25:02.799 tst (EURUSD,H1) continue , i = 3

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 4

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 5

2020.09.01 08:25:02.799 tst (EURUSD,H1) continue , i = 6

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 7

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 8

2020.09.01 08:25:02.799 tst (EURUSD,H1) continue , i = 9

 
Igor Makanu:

тогда нужно было сделать более наглядный пример, чтобы разобраться с оператором continue, я бы такой код писал:

2020.09.01 08:25:02.798 tst (EURUSD,H1) continue , i = 0

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 1

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 2

2020.09.01 08:25:02.799 tst (EURUSD,H1) continue , i = 3

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 4

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 5

2020.09.01 08:25:02.799 tst (EURUSD,H1) continue , i = 6

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 7

2020.09.01 08:25:02.799 tst (EURUSD,H1) i = 8

2020.09.01 08:25:02.799 tst (EURUSD,H1) continue , i = 9

Это слишком сложно для моего понимания, но мысль понял - надо проверить на практике, будет i увеличиваться при наступлении continue или останется с прежним значением. Судя по вашему примеру оно таки увеличивается.
 
Continue это переход в начало цикла, другого смысла в нем нет. Итератор он не увеличивает, просто следующие за ним строки до закрывающей скобки цикла не читаются.
 
Aleksei Stepanenko:
Continue это переход в начало цикла, другого смысла в нем нет. Итератор он не увеличивает, просто следующие за ним строки до закрывающей скобки цикла не читаются.
Итератор не увеличивается, то есть другими словами вычисление Выражения 3, в нашем случае i++(i+=1), не происходит, правильно вас понял? А то все эти термины... итератор, детерминатор, дуальный геотропизм... ))
 

continue используется для прерывания итерации цикла и перехода к следующей

так что в циклах с итератором, итератор все таки наращивается

 

int i; 
for(i=0; i<5; i++)
   {
   //здесь код 1
   if(условие) continue;
   //здесь код 2
   }

Начинается цикл, в первом проходе i=0,

исполняем код 1,

доходим до if,

если условие не выполняется исполняем код 2,

доходим до закрывающей скобки и переходим на for,

увеличиваем i на единицу и проверяем, что i<5

если меньше, то заходим на второй круг, если не меньше, то переходим за закрывающую скобку, то есть выходим из цикла.


Во втором проходе если условие в if выполняется, то по continue сразу переходим на for, не выполняя код 2.

и тут как всегда, i увеличиваем на единицу и проверяем неравенство


В итоге после цикла i будет равно 5 потому, что мы сначала увеличиваем, а потом проверяем.

 
Rustamzhan Salidzhanov:

continue

Рустамжан, Сергей спрашивал, не увеличивает ли оператор continue счетчик i. Я так понял его вопрос.

 
Aleksei Stepanenko:

В итоге после цикла i будет равно 5 потому, что мы сначала увеличиваем, а потом проверяем.

а справку не судьба дочитать ? 

))))

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

и опять по кругу - проверяем + тело + увеличиваем


как будет работать такой цикл:

void OnStart()
{
   int arr[5];
   for(int i = 0; i < ArraySize(arr); printf("printf: i = %d", ++i))
   {
      arr[i] = i;
      Print("Print: arr[",i,"] = ",arr[i]);
   }
}


как Вы пишете, должен быть выход за пределы массива - я специально в пример даже  преинкремент  вставил  ;)

2020.09.01 12:03:36.029 tst (EURUSD,H1) Print: arr[0] = 0

2020.09.01 12:03:36.029 tst (EURUSD,H1) printf: i = 1

2020.09.01 12:03:36.029 tst (EURUSD,H1) Print: arr[1] = 1

2020.09.01 12:03:36.029 tst (EURUSD,H1) printf: i = 2

2020.09.01 12:03:36.029 tst (EURUSD,H1) Print: arr[2] = 2

2020.09.01 12:03:36.029 tst (EURUSD,H1) printf: i = 3

2020.09.01 12:03:36.029 tst (EURUSD,H1) Print: arr[3] = 3

2020.09.01 12:03:36.029 tst (EURUSD,H1) printf: i = 4

2020.09.01 12:03:36.029 tst (EURUSD,H1) Print: arr[4] = 4

2020.09.01 12:03:36.029 tst (EURUSD,H1) printf: i = 5

Причина обращения: