2015-02-06 2 views
1

Недавно я начал изучать java в своем классе по информатике, и я получил нечто интересное. В принципе у меня есть мой переменные установить в качестве следующего int x = 5;Путаница о результатах до и после декретов

Я создал выражение x = (x--) - (--x) , когда я не печатать переменную й он всегда приводит в качестве 2, независимо от того, что переменная x есть.

Точный код:

import acm.program.*; 

public class MathOperations extends ConsoleProgram { 

    private static final long serialVersionUID = 1L; 

    public void run(){ 

     setFont("arial-bold-24"); 

     int x = -5, y = -3; 
     double z = 2.2; 

     x = (x--) - (--x); 

     println ("x= " + x); 
    } 

} 

Почему результат всегда 2?

+1

Ваш вопрос «Почему результат всегда 2?»? – rgettman

+0

Да, как вы пришли к такому результату –

+0

И после того, как @rgettman отправил свой ответ, ему должно быть достаточно сказать, что вы никогда не должны делать такие причудливые вещи, как до и после декремента. –

ответ

4

Результат всегда 2, для любого int вы можете использовать. Причина:

(x--) оценивается сначала, потому что операнды оцениваются слева направо. Это дает исходное значение x, но впоследствии x является оригинальным x - 1. Затем оценивается (--x). Она возвращает x - 1, который уже был уменьшенные один раз, так что результат является оригинальной x - 2.

Оттуда, это простая математика, x - (x - 2) является 2.

Но как насчет возможного нижнего предела в декрете?

int x = Integer.MIN_VALUE + 1; 
x = x-- - --x; 
System.out.println(x); 

В результате все еще 2. Как? Integer.MIN_VALUE является:

10000000 00000000 00000000 00000000 

дважды Уменьшение номера даст Integer.MAX_VALUE - 1.

01111111 11111111 11111111 11111110 

Вычитание в 2 дополнением обозначения выходов

00000000 00000000 00000000 00000010 

или 2, даже если сгущенного происходит.

Это верно для любого интегрального типа: byte, short, int и long.

Интересно, что это также относится к самым общим значениям с плавающей точкой, таким как 2.2.

Однако, если точность типа с плавающей запятой больше 1, тогда результат операции декремента будет не изменить значение. В этом случае результатом будет 0.

double x = (double) (1L << 54); 
x = x-- - --x; 
System.out.println(x); 

Результат:

0.0 
+0

Я бы добавил, что выражение оценивается слева направо, если круглые скобки установить другой приоритет. – watery

+0

Кроме того, просто знайте о нижнем потоке для «any' int » – ryanyuyu

0

Java оценивает операторов с фиксированной order of precedence.Эта строка кода x = (x--) - (--x) имеет 4 оператора: префикс--, постфикс--, вычитание, назначение. Упорядоченные по приоритету, они постфикс -, prexfix (унарный) -, вычитание (добавка) и назначение. Это делает ваше заявление действовать в следующем порядке:

  1. x = 5 - (--x): х (5) уменьшается после этой операции
  2. x = 5 - (3): х декрементируется снова от это ранее декрементируется значение 3
  3. x = 5 - 3
  4. x = 2
Смежные вопросы