2013-09-08 3 views
0

Недавно я написал фрагмент кода, как этотПочему оператор приращения не меняет значение переменной в java?

public class TestIncrement { 

    public static void main(String[] args){ 
     double a = 12.4; 
     double b = 5.6; 
     a -=b -=b -= b -= b -= b -= b; 
     System.out.println(a); 
     a-=b; 
     System.out.println(a); 
    } 
} 

и выход:

12.4 
12.4 

Почему прибавка оператор не работает?

+8

Попытайтесь напечатать значение Ь (А спроси себя, почему это, что значение) – FDinoff

+4

Im несколько удивлен это компилируется, это, конечно, никогда не следует использовать –

+0

Это * декремент * – user2357112

ответ

2

Это действительно работает. Ваша переменная b равна 0.

9

-= и все другие операторы присваивания являются право-ассоциативными. Эта линия:

a -=b -=b -= b -= b -= b -= b; 

не означает "уменьшить a значением b 6 раз". Это означает то же самое, как это:

a -= (b -= (b -= (b -= (b -= (b -= b))))); 

, что означает «уменьшить b значением b, затем уменьшаются b новым значением b, а затем сделать еще 3 раза, а затем уменьшают a от конечного значения b ". b 0 после первого -=, так что остальные заявления ничего не делает, как делает линию

a-=b; 

.

+2

Или резюмировать,.. Если вы собираетесь написать безумную программу, не удивляйтесь, когда она делает безумные вещи –

+0

+1 для объяснения проблемы –

1

Если я ставлю скобки все, что, чтобы сделать его легче понять, мы получаем следующее:

public class TestIncrement { 
    public static void main(String[] args){ 
     double a = 12.4; 
     double b = 5.6; 
     a -= (b -= (b -= (b -= (b -= (b -= b))))); 
     System.out.println(a); 
     a -= b; 
     System.out.println(a); 
    } 
} 

Первый b -= b оператор устанавливает b в 0. После того, как 0 вычитается из b еще 4 раза, результатом остается 0, что, очевидно, оставляет значение a без изменений. Даже если вы попробуете еще раз, в строке a -= b, вы все равно получите тот же результат: 12.4 − 0.0 = 12.4.

0

Вы могли бы подумать об этом самостоятельно, написав более простой пример.

public static void main(String[] args){ 
    int a = 1; 
    int b = 2; 
    int c = 3; 

    a -= b -= c; 

    System.out.println(a + " " + b + " " + c); 
} 

Вы были бы удивлены, увидев, что выход 2 -1 3
Эта причина, приведенный выше код равен:

public static void main(String[] args){ 
    int a = 1; 
    int b = 2; 
    int c = 3; 

    b -= c; 
    a -= b; 

    System.out.println(a + " " + b + " " + c); 
} 

Не делайте код спагетти. :(