Объясните Java Унарный оператор - PullRequest
1 голос
/ 18 июля 2009

Проверьте этот код:

int result = 0;
result = result++;
System.out.println("Result 1 = " + result);
result++;
System.out.println("Result 2 = " + result);

Результат, который я ожидал, был:

Result 1 = 1
Result 2 = 2

Но я получил вывод:

Result 1 = 0
Result 2 = 1

Проблема в Line2. Может кто-нибудь объяснить на унарный оператор .??

Ответы [ 5 ]

6 голосов
/ 18 июля 2009

В заявлении i = i++:

Это гарантированное поведение. Значение i считывается для оценки правой части задания. i затем увеличивается. В результате в конце выписки результат оценки присваивается i.

В i = i++; есть два назначения, и последнее из них будет определять результат. Последним будет выполняться всегда назначение уровня оператора, а не инкремент / декремент.

Ужасный способ написания кода, но у вас есть, по крайней мере, детерминированный результат.

http://forums.sun.com/thread.jspa?threadID=318496

3 голосов
/ 18 июля 2009

Когда вы делаете x ++, результатом является значение до приращения

2 голосов
/ 18 июля 2009

Это ожидаемое поведение. То, что на самом деле происходит, имеет больше смысла, если вы посмотрите на то, что происходит на уровне байт-кода, когда выполняется соответствующая строка:

результат = результат ++;

registerA = результат (registerA == 0)
результат + = 1 (результат == 1) - эти первые две строки являются результатом ++ part
результат = регистр А (результат == 0)

Переменная «результат» присваивается дважды в этом операторе, один раз с приращением, а затем снова со значением до приращения, что, по сути, делает его пустым.

2 голосов
/ 18 июля 2009

Вы должны осознавать, где вы размещаете унарный оператор. Помещение переменной ++ после приводит к тому, что java вычисляет выражение с использованием переменной, затем увеличивает переменную, а при размещении переменной ++ перед переменная java увеличивает значение переменной оцените выражение.

2 голосов
/ 18 июля 2009

Заменить эту строку:

результат = результат ++;

с:

результат ++;

В первой строке вы присваиваете ноль результату. Зачем? Потому что оператор постинкремента первым назначит ноль результата.

Если бы вы написали:

результат = ++ результат;

Сначала вы увеличиваете, а затем присваиваете, также получая желаемый результат.

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