2016-08-20 3 views
-1

Рассмотримприоритет java-оператора y = x + (x = 10);

int x=1; 
int y1 = (x=10) + x; 
System.out.println(y1); 
// prints 20 

x = 1; 
int y2 = x + (x=10); 
System.out.println(y2); 
// prints 11 

В первом примере,() выполняется первым, поскольку он имеет наивысший приоритет; устанавливает значение x значение 10 и, следовательно, правый операнд (x) получает новое значение 10, и поэтому

Во втором примере левый операнд «x» получает свое значение 1, тогда выполняется() и x получает новое значение 10, поэтому y2 = 1+10 = 11;

Почему во втором примере() не выполняется первым; поэтому (x = 10) выполняется сначала, а левый операнд x должен быть установлен на его новое значение 10 и, следовательно, y2 = 20; но так не получилось?

+1

Не путайте приоритет с порядком оценки операндов. –

ответ

2

Я считаю, что операнды просто оцениваются слева направо. Скобки в правом операнде не меняют того факта, что левый операнд сначала оценивается.

+1

Не верьте. Быть уверенным. См. [Спецификация языка Java §15.7 Порядок оценки] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.7): * Язык программирования Java гарантирует, что операнды операторов, по-видимому, оцениваются в определенном порядке оценки, а именно ** слева направо **. * – Andreas

+0

@ Andreas Спасибо! – smarx

0

Возможно, это помогает подумать о int z = f() + g(), то есть вызывать два метода. Зачем сначала вызывать g()? Что относительно int z = f() + (g()) (вспомните дополнительную скобку)? Слева направо происходит то, что происходит, где (x=10) - это просто конструкция, которая - при оценке - присваивает x и возвращает 10 туда, где используется эта конструкция.

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