3

Сомнительный результат в следующем коде:унарные операции, слитые с присвоением

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

Ожидал как выход, как «я + = 2» следует обновление я, но это не ведет себя так.

Выход: 6

я делаю вывод, что оператор присваивания стенография возвращается , как ожидалось, но не обновляя же в переменной я. Любое объяснение будет оценено.

+1

Это неопределенное поведение в C/C++. По уважительной причине. Вы не должны этого делать. –

+1

@JanDvorak Конечно, но в Java это * определено *, и пока вы не должны делать это на практике, это интересный академический вопрос. – berry120

+2

@ berry120: Спасибо за хорошо объясненное объяснение сэра Берри. :) –

ответ

8

i++ - это постфиксное приращение - оно увеличивает i, то по существу возвращает старое значение i. Оператор эквивалентных префиксов, ++i, вернет «обновленное» значение, но это не то, что используется здесь.

i+=2 работает по-разному, однако, это по существу эквивалентно i+2, так как делает возвращает обновленное значение.

Однако, я думаю, где возникает путаница в том, что вы смотрите на это так:

i = (i += 2) + i++; 

... который делает дать свой ожидаемый результат. i+=2 дает 4, и обновляет i до 4, затем i++ возвращает 4 (вместо 5, так как это пост инкремент.) Тем не менее, если принять оператор приоритет в уравнение, Java на самом деле «скобки» это как это по умолчанию:

i = i += (2 + i++); 

Просто чтобы прояснить путаницу, Java оценивает это так, потому что += оператор has least precedence in this example, и поэтому выражение сложения (+) вычисляется первым.

Это квадратные скобки утверждение по существу эквивалентно:

i = (i = i + (2 + i++)); 

Который в свою очередь, упрощает для:

i = i + (2 + i++); 

Поэтому, учитывая приведенное выше утверждение, и оценки слева направо, первый взять значение i (2), а затем добавить к нему значение 2+i++; последний дает 4 (из-за приращения постфикса). Таким образом, наш окончательный результат равен 2 + 4, что равно 0.

+0

И почему это возвращает 8: 'i = 2; i = (i + = 2) + i ++; '?? –

+0

Ах, ты изменил свой ответ .. !! Я собирался указать на этот недостаток. –

+0

@AhmedKRAIEM Обновлено теперь, чтобы объяснить! – berry120