Операции Post и Pre приращения - PullRequest
8 голосов
/ 23 декабря 2011

Когда я запускаю следующий пример, я получаю вывод 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 ]

5 голосов
/ 23 декабря 2011

Если мы развернем оператор 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

Я думаю, что основные шаги можно суммировать, как указано выше.

3 голосов
/ 23 декабря 2011
 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; 

Другой такой пример:

1 голос
/ 23 декабря 2011

Чтобы получить подробное описание, вы должны увидеть Выражение и его Порядок оценки

Вот небольшое объяснение уравнения i ++ + f1 (i) оценка

В компиляторе уравнений получим "i" , который равен 1 и поместим его в стек как первый операнд , затем , приращение "i" , поэтому его значение будет 2 , и он вычисляет второй операнд, вызывая функцию, которая будет 0 и во время операции (+) операнды выполнения будут 1 и 0 .

1 голос
/ 23 декабря 2011

В пост-инкрементном операторе значение воли операнда будет увеличиваться после использования. Пример * +1003 *

int k =1;
        int l = k++;
        System.out.println("...k..."+k+"...l.."+l);

Первому k (значение = 1) присваивается l, после чего значение k будет увеличиваться

Аналогично происходит в следующей строке

i = i++ + f1(i);
1 голос
/ 23 декабря 2011

Надеюсь, что это объяснение может помочь:

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)'

Таким образом, вкратце, во время постинкремента выражение сначала решается, а затем значение увеличивается. Но в предварительном приращении значение сначала увеличивается, а затем выражение решается.

Но если ты пишешь только

i++;
++i;

Тогда оба означают одно и то же.

Привет

1 голос
/ 23 декабря 2011

Предварительное увеличение означает: добавить единицу к переменной и вернуть увеличенное значение;Постинкремент - сначала верните 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;
1 голос
/ 23 декабря 2011

Решение можно понять из этого примера

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, вы переопределяете его с помощью оператора присваивания.

...