не может разобрать это назначение в Java - PullRequest
7 голосов
/ 04 марта 2010

Кто-нибудь может объяснить это, почему это происходит

int i=0;
i=i++;
i=i++;
i=i++;
System.out.println(i);

печатает ноль.

Ответы [ 4 ]

14 голосов
/ 04 марта 2010

i++ - постинкремент ( JLS 15.14.2 ). Он увеличивает i, но результатом выражения является значение i перед шагом. Присвоение этого значения обратно i в действии сохраняет значение i без изменений.

Разбейте это так:

int i = 0;
int j = i++;

Легко понять, почему j == 0 в этом случае. Теперь вместо j мы заменяем левую часть на i. Правое значение по-прежнему равно 0, и поэтому вы получаете i == 0 в своем фрагменте.

4 голосов
/ 04 марта 2010

Вы хотели это сделать:

int i = 0;
i++;
i++;
i++;
System.out.println(i);

i++ фактически выполняет задание, поэтому, если вы добавите =, вы просто запутаете вещи. Эти другие прекрасные ответчики могут дать вам мельчайшие подробности, некоторые детали этого ускользнут от меня. :)

0 голосов
/ 11 апреля 2010

Пусть I=++, увеличение и A=i, назначение. Они некоммутативны: IA != AI.

Резюме

IA = "first increase then assignment"

AI="first assignment then increase"

Встречный Пример

$ javac Increment.java 
$ java Increment 
3
$ cat Increment.java 
import java.util.*;
import java.io.*;

public class Increment {
    public static void main(String[] args) {
        int i=0;
        i=++i;
        i=++i;
        i=++i;
        System.out.println(i);
    }
}

Относящиеся

0 голосов
/ 04 марта 2010

Во-первых, вы не должны писать такой код ....

Но если мы рассмотрим ради вопросов, то это просто: это связано с тем, как постфиксный оператор «возвращает» значение. Постфикс имеет приоритет над оператором присваивания, но оператор постфикса после увеличения значения i возвращает предыдущее значение i. Так что мне снова присваивают его предыдущее значение.

И снова не используйте эту конструкцию в своем коде, поскольку следующий программист, который увидит, что он придет за вами (с чем-то большим в его руках):)

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