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 - это значение переменной перед новым значением на хранении.


ничего общего с приоритетом оператора как таковым, просто порядок оценки. Здесь нужно знать две вещи:

  1. x++ является постфиксным приращением, поэтому значение x увеличивается после оценивается
  2. * оценивает правую сторону, затем левую сторону.

учитывая пункт 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