Требуется понять для цикла лучше - оператор пост-приращения

Я был не совсем понятен с оператором post increment, который я всегда использовал для циклов. Моим последним и новым пониманием оператора post increment является следующее:

int a = 5
int b = a++ //a will increment and return back its old value 5
so b = 5

Вооружившись этим новым знанием, я решил понять/применить его к местам, где я обычно использовал оператор post increment, как в цикле for. Теперь кажется, что я потерялся так как я получаю теоретически теоретически

Рассмотрим следующий код

for(int i=0 ; i< 3 ; i++)
{
  std::cout << i; 
}

Первый цикл

i starts with 0 which is less than 3 so ( increment by 1 however since its i++ it returns old value 0) 
so cout should display 1 // But it displays 0

Вторая петля

 i is now 1 which is less than 3 so i++ is applied - Now i is 2 and returns back 1
 so cout should display 2 //But it display 1

Третий цикл

 i is now 2 which is less than 3 so i++ is applied - Now i is 3 and returns back 2
 so cout should display 3 //But it display 2

Четвертая петля

 i is now 3 which is not less than 3 so loop exits

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

Ответы

Ответ 1

Что вам не хватает, когда каждый из этих разделов оператора for:

for (int i = 0 ; i < 3 ; i++)
//   111111111   22222   333
  • Первый бит выполняется один раз перед выполнением любых итераций.
  • Второе выражение оценивается перед каждой потенциальной итерацией и, если ложно, дальнейших итераций не выполняется.
  • Третий бит выполняется в конце каждой итерации, прежде чем возвращаться, чтобы оценить второй бит.

Теперь внимательно прочитайте эту последнюю марку. i++ выполняется в конце итерации после cout << i. И сразу же после этого проверяется условие продолжения (вторая часть).

Итак, цикл фактически совпадает с:

{   // Outer braces just to limit scope of i, same as for loop.
    int i = 0;
    while (i < 3) {
        cout << i;
        i++;
    } 
}

Вот почему вы получаете 0 1 2.

Ответ 2

Точки с запятой в цикле for ограничивают три разных выражения. Значение третьего выражения не имеет значения для поведения цикла. Вы можете заменить i++ на ++i, и ваш цикл будет вести себя одинаково; в любом случае, i увеличивается на 1.

Чтобы наблюдать поведение операторов инкремента, рассмотрим следующие циклы:

for(int i = 0 ; i++ < 3 ; ) cout << i;
/*                      ^^^ Nothing here!                      */

Обратите внимание, что третье выражение пусто. Вывод 123 -0 пропускается, потому что тест, включая приращение, встречается перед каждой итерацией цикла.

Как работает постинкрементная петля по сравнению с аналогичным с оператором preincrement?

for(int i = 0 ; ++i < 3 ; ) cout << i;

Теперь вывод 12 -3 не печатается, потому что условный тест видит значение 3, как только он увеличивается до этого, поэтому цикл выходит.

Ответ 3

Вам просто нужно знать, что оператор int i = 0 выполняется первым, то есть i принимает сначала значение 0, проверяет, является ли условие истинным, а затем, каково тело цикла.

Затем i увеличивается.