2016-12-14 2 views
-4

Это код:Почему выход -120?

public class Boy { 
    public static void main(String[] args) { 
     int i = 12; 

     System.out.print(i += i -= i *= i); 
    } 
} 

Почему выход -120, как увидеть выполняющую деталь Что шаг за шагом процедуры?

+0

Шаг за шагом было бы написать операторы. –

+3

SO здесь не для того, чтобы делать домашние задания для вас. – AntoineB

+1

есть ............ – Ivaro18

ответ

6

Вот три вещи, которые вам нужно знать:

  1. Выражения оцениваются слева направо.

  2. 2 операнда бинарного оператора оцениваются до применения оператора.

  3. В сложном операторе присваивания (например, + =, - =, * =) исходное значение левого операнда (того, для которого вы назначаете результат) сохраняется до выполнения операции.

Теперь давайте оценивать

i += i -= i *= i 

Первый оператор + =. Его первый операнд равен 12, а его второй операнд - i -= i *= i - должны быть оценены, прежде чем мы сможем оценить + =

Таким образом, мы переходим к оценке

i -= i *= i 

Первый операнд является 12, а второй является i *= i. Мы должны оценить, что второй операнд, прежде чем мы можем оценить - =

Двигаемся

i *= i 

Первый операнд равен 12, а второй операнд равен 12, таким образом мы получаем 144.

Теперь вернемся к

i -= 144 

Как вы помните, первый операнд был 12, поэтому мы получаем 12 - 144 = -132.

Теперь вернемся к

i += -132 

Первый операнд был 12, таким образом мы получаем 12 + -132 = -120, который является конечным значение, присвоенное I.

+2

Спасибо Эрану за правильный ответ. –

+0

Благодарим вас за терпение. @ Eran – Dolphin

1

Это из-за приоритета Calcul

я * I = 144

затем

я + I = 12 + 12 = 24

и, наконец,

II = 24 -144 = -120

+7

12 - 144 = -120? – Ivaro18

+5

Но это не вся правда. Как вы объясните, что '+ =', '- =' и '* =' не присваивают 'i' в этом случае? Заявление не является 'i * i', а' i * = i', что является 'i = i * i'. –

+0

@ ivaro18 sorry type fault ^^ – Kryze

Смежные вопросы