Требуется понять для цикла лучше - оператор пост-приращения
Я был не совсем понятен с оператором 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
увеличивается.