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

 

Игорь, думаете я неправильно сказал? Хм... Возможно, сейчас почитаю справку. Но, i в моём случае после цикла точно будет равен 5. То есть увеличение произошло, но внутрь цикла не попали. Почему?

 
Aleksei Stepanenko:

Игорь, думаете я неправильно сказал? Хм... Возможно, сейчас почитаю справку. Но, i в моём случае после цикла точно будет равен 5. То есть увеличение произошло, но внутрь цикла не попали. Почему?

не знаю

но итераторы тут не причем

for() - это оператор, который выполняет по очереди " 3 команды "   разделенных точкой запятой - и все

что Вы там напишете, вообще не важно, за исключением того, что второе выражение должно быть логическим

но суть for() - выполни 1,2,3 по очереди - ну все просто же )))

 

Второе выражение i<5.

первый проход i=0, затем 1,2,3,4

внутри цикла последнее значение i=4.

То есть второе выражение пропустило 4, но не пропустило 5.

За пределами цикла i=5.

Вопрос, что произошло вперёд, увеличение i или сравнение?

 
Aleksei Stepanenko:

Второе выражение i<5.

первый проход i=0, затем 1,2,3,4

внутри цикла последнее значение i=4.

То есть второе выражение пропустило 4, но не пропустило 5.

За пределами цикла i=5.

Вопрос, что произошло вперёд, увеличение i или сравнение?

нет


логика другая

проход начинается с момента i<5 ? - да! запустили тело цикла - тело цикла закончилось, выполнили "выражение 3" оператора for()

 а присваивание - "выражение 1" - оно вообще не участвует в теле цикла, можете даже опустить присваивание i=0

int i = 0, j = 0;
   for(; i < 10;)
   {
      printf("i = %d , j = %d", i++, j++);
   }


можно и так цикл организовать:

void OnStart()
{
   int i = 0, j = 0;
   for(; i < 10; printf("i = %d , j = %d", i++, j++))
   {

   }
}

UPD:

забыл привычный Вам цикл добавить в пример:

void OnStart()
{
   for(int i = 0, j = 0; i < 10; i++, j--)
   {
      printf("i = %d , j = %d", i, j);
   }
}
 

Оператор for эквивалентен следующей последовательности операторов:

выражение1;
while(выражение2)
  {
   оператор;
   выражение3;
  };

Правильно понимаю, что если в данном примере "оператор" заменить на continue, то for(1; 2; 3) будет вечным циклом?
 
Игорь, конкретно на моём самом простом примере, Вы можете объяснить, как произошла работа цикла из 5 итераций, и почему после работы цикла i равняется 5?
 
Aleksei Stepanenko:
Игорь, конкретно на моём самом простом примере, Вы можете объяснить, как произошла работа цикла из 5 итераций, и почему после работы цикла i равняется 5?

ОК

void OnStart()
{
   for(int i = f1(); f2(i); f3(i))
   {
      Print("Тело цикла, i = ",i);
   }
}
//+------------------------------------------------------------------+
int f1()
{
   Print(__FUNCTION__);
   return(0);
}
bool f2(int v)
{
   Print(__FUNCTION__);
   return(v<5);
}
void f3(int &v)
{
   Print(__FUNCTION__);
   v++;
}

2020.09.01 12:48:29.518 tst (EURUSD,H1) f1

2020.09.01 12:48:29.522 tst (EURUSD,H1) f2

2020.09.01 12:48:29.522 tst (EURUSD,H1) Тело цикла, i = 0

2020.09.01 12:48:29.522 tst (EURUSD,H1) f3

2020.09.01 12:48:29.522 tst (EURUSD,H1) f2

2020.09.01 12:48:29.522 tst (EURUSD,H1) Тело цикла, i = 1

2020.09.01 12:48:29.522 tst (EURUSD,H1) f3

2020.09.01 12:48:29.522 tst (EURUSD,H1) f2

2020.09.01 12:48:29.522 tst (EURUSD,H1) Тело цикла, i = 2

2020.09.01 12:48:29.522 tst (EURUSD,H1) f3

2020.09.01 12:48:29.522 tst (EURUSD,H1) f2

2020.09.01 12:48:29.522 tst (EURUSD,H1) Тело цикла, i = 3

2020.09.01 12:48:29.522 tst (EURUSD,H1) f3

2020.09.01 12:48:29.522 tst (EURUSD,H1) f2

2020.09.01 12:48:29.522 tst (EURUSD,H1) Тело цикла, i = 4

2020.09.01 12:48:29.522 tst (EURUSD,H1) f3

2020.09.01 12:48:29.522 tst (EURUSD,H1) f2




все работает как в справке написано:

f1 - был вызван один раз 

затем f2 , затем тело цикла и лишь затем f3

окончание цикла посмотрите - только  f2 был вызван - ни тело ни f3 уже не вызывались

 
Почему i равно 5?
 
EfremovSergey:
если в данном примере "оператор" заменить на continue, то for(1; 2; 3) будет вечным циклом?

continue это просто переход. Вечный цикл будет, если условие цикла выполняется вечно.

while(true)
   {

   }

for(,true,)
   {
   
   }


EfremovSergey:

Оператор for эквивалентен следующей последовательности операторов:

выражение1;
while(выражение2)
  {
   оператор;
   выражение3;
  };

нет не эквивалентен, в for выражение3 исполнится в любом случае, потому что continue оборвёт этот текущий проход и направит как раз к Выражению3

Вот описание из этого источника:

В случае с циклом for часть инкремента/декремента счетчика по-прежнему выполняется
даже после выполнения continue (так как инкремент/декремент происходит вне тела цикла).

Будьте осторожны при использовании оператора continue с циклами while или do while.
Поскольку в этих циклах инкремент счетчиков выполняется непосредственно в теле цикла,
то использование continue может привести к тому, что цикл станет бесконечным!
 
Aleksei Stepanenko:
Почему i равно 5?

потому,что когда тело цикла закончилось в котором i=4  - было вызвано "выражение  3" - у меня f3() ,в котором было i++

следующая итерация начинается с проверки -  f2() - проверили? нельзя цикл продолжать? - все тело не выполняем выходим из for


посмотрите принты в моем последнем примере, там все по очередности вызовов