Почему в течение l oop значение, присвоенное временной переменной, не печатается как есть? - PullRequest
1 голос
/ 10 марта 2020

Моя демонстрационная программа:

public static void main(String x[])
{
    int tempVal = 5;
    for(int i = 0; i < 5; tempVal = i++)
    {
        System.out.println("Value Of i: "+i +" _tempVal:"+tempVal);
    }
}

Выход:

Значение I: 0 _tempVal: 5

Значение I: 1 _tempVal: 0

Значение I: 2 _tempVal: 1

Значение I: 3 _tempVal: 2

Значение I: 4 _tempVal: 3

Почему переменная "tempVal" не имеет того же значения, что и "i"?

Ответы [ 4 ]

5 голосов
/ 10 марта 2020

Потому что вы постинкрементно. Это означает, что tempValue = i, но затем i увеличивается.

А почему на первой итерации tempValue еще 5? В Руководстве для программистов ОСА есть хорошая цифра

enter image description here

, которая объясняет каждый шаг в течение для l oop, и здесь важно то, что оператор обновления выполняется ПОСЛЕ тело выполнение.

Чтобы быть более точным c, рисунок взят из "Глава 2 ( Операторы и операторы) " (рисунок 2.7)

1 голос
/ 10 марта 2020

(1) Сначала необходимо понять последовательность, в которой выполняются предложения for l oop. Отладчик также является хорошим инструментом для визуализации потока.

Третье предложение (tempVal = i++;) в for l oop выполняется после окончания первой итерации. Поэтому для первой итерации, где i равно 0, переменная tempVal по-прежнему равна 5.

(2) Вам необходимо понять разницу между post (i++) и предварительным приращением (++i) ).

То, что вы делаете, - это пост пост. Следовательно, текущее значение i присваивается tempVal. Затем я увеличивается. Если вы выполняли предварительное увеличение, i увеличилось бы на 1, а затем окончательное значение было бы присвоено tempVal. Оформить заказ следующим фрагментом:

for(int i = 0, tempVal = i; i < 5; tempVal = ++i)
{
    System.out.println("Value Of i: "+i +" _tempVal:"+tempVal);
}
1 голос
/ 10 марта 2020

Третий пункт объявления for l oop выполняется ПОСЛЕ тела l oop. Переменная i увеличивается после присваивания tempVal. Итак, развернув ваш l oop, мы получим следующее:

// setup
int tempVal = 5;
int i=0;

// start of first loop iteration
System.out.println("Value Of i: "+i +" _tempVal:"+tempVal); 
// end of first loop iteration
tempVal = i; // 0
i = i+1; // 1

// start of second loop iteration
System.out.println("Value Of i: "+i +" _tempVal:"+tempVal); 
// end of second loop iteration
tempVal = i; // 1
i = i+1; // 2

etc...
0 голосов
/ 10 марта 2020

Обновление части для l oop: tempVal = i++ произойдет после первой итерации. Тогда значение 0 присваивается tempVal, потому что вы используете пост-приращение i++.

При изменении i++ на ++i tempVal будет 1 во второй раз вместо 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...