a += a++ * a++ * a++ в Java. Как его оценивают?
я столкнулся с этой проблемой на этом сайте, и попробовал его в Eclipse, но не мог понять, как именно они вычисляются.
int x = 3, y = 7, z = 4;
x += x++ * x++ * x++; // gives x = 63
System.out.println(x);
y = y * y++;
System.out.println(y); // gives y = 49
z = z++ + z;
System.out.println(z); // gives z = 9
согласно комментарию на веб-сайте, x += x++ * x++ * x++ разрешается в x = x+((x+2)*(x+1)*x), что оказывается правдой. Я думаю, что мне не хватает чего-то в этом приоритете оператора.
6 ответов
Java оценивает выражения слева направо & в соответствии с их приоритетом.
int x = 3, y = 7, z = 4;
x (3) += x++ (3) * x++ (4) * x++ (5); // gives x = 63
System.out.println(x);
y = y (7) * y++ (7);
System.out.println(y); // gives y = 49
z = z++ (4) + z (5);
System.out.println(z); // gives z = 9
Postfix increment оператор только увеличивает переменную после того, как переменная используется/возвращается. Все кажется правильным.
это псевдокод для постфиксного оператора инкремента:
int x = 5;
int temp = x;
x += 1;
return temp;
из JLS 15.14.2 (ссылка):
значение выражения postfix increment - это значение переменной перед новым значением на хранении.
ничего общего с приоритетом оператора как таковым, просто порядок оценки. Здесь нужно знать две вещи:
-
x++
является постфиксным приращением, поэтому значениеx
увеличивается после оценивается -
*
оценивает правую сторону, затем левую сторону.
учитывая пункт 2, выражение x++ * x++ * x++
можно переписать более конкретно как x++ * (x++ * (x++))
.
все выражение можно написать как процедуры:
a = x
x += 1
b = x
x += 1
c = a*b
d = x
x += 1
return c*d
оператор postfix x++
означает что-то вроде "дайте мне значение x сейчас, но увеличьте его для будущих ссылок"
таким образом,порядок операций и оценки,
x++ * x++ * x++
сначала интерпретируется как
3 * 4 * 5
(=60)
который затем добавляется к оригинал 3, уступая 63.
используется исходное значение потому что это на той же линии, у вы написали что-то вроде:
int x = 3;
int y += x++ * x++ * x++;
x += y;
x
теперь будет 66, а не 63, потому что x
во второй строке теперь 6, а не его оригинал 3.
потому что операция приращения ++ добавляется после переменной x. Это операция приращения должности. Это означает, что x увеличивается после обработки операции.
In your example the expression would be:
x += 3 * 4 * 5
First the expression is added by 3 (x+=....)
then the first x++ results in 3
the second x++ results in 4 (because it was incremented before)
and the third x++ results in 5.
Если вы хотите, чтобы ваша переменная увеличивалась до выполнения операции, вы должны написать ++x (pre increment operation)
потому что postincrement изменяет переменную после того, как значение берется и += оценивает ее левую сторону перед оценкой ее правой стороны,
x += x++ * x++ * x++;
становится
tmp0 = x
tmp1 = x
++x
tmp2 = tmp1 * x
++x
tmp3 = tmp2 * x
++x
x = tmp0 + x
унарные операторы оцениваются слева направо, поэтому первый x++
получает значение x
, второй -(x+1)
, etc. И += оценивается в соответствии со значением x
в начале, следовательно, добавление x