Операторы Post и Pre increment
когда я запускаю следующий пример, я получаю выход 0,2,1
class ZiggyTest2{
static int f1(int i) {
System.out.print(i + ",");
return 0;
}
public static void main(String[] args) {
int i = 0;
int j = 0;
j = i++; //After this statement j=0 i=1
j = j + f1(j); //After this statement j=0 i=1
i = i++ + f1(i); //i++ means i is now 2. The call f1(2) prints 2 but returns 0 so i=2 and j=0
System.out.println(i); //prints 2?
}
}
Я не понимаю, почему выход 0,2,1, а не 0,2,2
7 ответов
i = i++ + f1(i);
i++
означает i
теперь 2
. Зов f1(i)
печать 2
но возвращает 0, так что i=2
и j=0
до этого i = 1
теперь представь f1()
вызывается и заменяется на 0
так
i = i++ + 0;
теперь это будет
i = 1 + 0 // then it will increment i to 2 and then (1 +0) would be assigned back to `i`
проще говоря (от здесь @ Piotr)
" i = i++ " примерно переводится как
int oldValue = i;
i = i + 1;
i = oldValue;
еще один такой пример :
Если мы расширим i = i++ + f1(i)
заявление, мы получаем что-то вроде следующего
save the value of i in a temp variable, say temp1 // temp1 is 1
increment i by one (i++) // i gets the value 2
execute f1(i), save return value in, say temp2 // temp2 is 0, print 2
assign temp1 + temp2 to i // i becomes 1 again
Я думаю, основные шаги можно обобщить, как указано выше.
решение можно понять из этого примера
public static void main(String[] args) {
int i = 0;
i = i++;
System.out.println("i is" + i);
}
/* The output is "i is 0" */
следовательно, из этой строки,
i = i++ + f1(i);
ваш i по-прежнему 1 и, очевидно, функция собирается вернуть 0. Который снова хранится в i и, следовательно, значение 1. Вместо обновленного значения i, хранящегося в i, вы переопределяете его оператором присваивания.
В Post increment значение оператора будет увеличиваться после использования операнда. пример
int k =1;
int l = k++;
System.out.println("...k..."+k+"...l.."+l);
сначала K (значение = 1) присваивается l после этого значение k будет увеличиваться
аналогичная вещь происходит в следующей строке
i = i++ + f1(i);
Pre increment значит: добавьте одно к переменной и возвратите инкрементированное значение; Post increment-сначала верните i, затем увеличьте его;
int i, j, k;
i = 0; // 0
j = i++; // return i , then increment i
// j = 0; i = 1;
k = ++i; // first increment and return i
//k = 2; i = 2;
// now
++j == --k == --i // would be true => 1==1==1;
// but , using post increment would
// j++ == k-- == i-- // false because => 0 == 2 == 2;
// but after that statement j will be 1, k = 1, i = 1;
чтобы углубиться, вам нужно увидеть выражение и его порядок оценки
вот небольшое объяснение об уравнении i++ + f1 (i) оценка
в компиляторе уравнений get "Я" что составляет 1 и поставить его на стек как первый операнд затем С шагом "Я", поэтому его значение будет 2, и вычисляет второй операнд, вызывая функцию, которая будет 0 и во время операции (+) операнды выполнения будут 1 и 0.
надеюсь, что это объяснение может помочь:
j = i++; // Here since i is post incremented, so first i being 0 is assigned to j
// and after that assignment , i is incremented by 1 so i = 1 and j = 0.
i = i++ + f1(i); // here again since i is post incremented, it means, the initial value
// of i i.e. 1 as in step shown above is used first to solve the
// expression i = i(which is 1) + f1(1)**Since i is 1**
// after this step the value of i is incremented. so i now becomes 2
// which gets displayed in your last System.out.println(i) statement.
это
i = ++i + f1(i); // here i will be first inremented and then that value will be used
// to solve the expression i = i + f1(i)'
короче говоря, во время Post increment выражение сначала решается, а затем значение увеличивается. Но в pre increment значение сначала увеличивается, а затем выражение решается.
но если вы пишете только
i++;
++i;
затем так-то же самое.
в отношении