В Java, который выполняется первым, " + "или"++"?


я попробовал следующий код в Java

t1 = 5;
t2 = t1 + (++t1);
System.out.println (t2);

мое мнение, так как ++ имеет более высокий приоритет, чем+, выше становится

t2 = t1 + (++t1);
t2 = t1 + 6;      // t1 becomes 6 here
t2 = 6 + 6;
t2 = 12;

однако, я получаю ответ 11 для t2. Может кто-нибудь объяснить?

10 52

10 ответов:

вы почти правы, но вы тонко недопонимаете, как работают правила приоритета.

сравнивать эти два случая:

int t1 = 5;
int t2 = t1 + (++t1);
System.out.println (t2);

t1 = 5;
t2 = (++t1) + t1;
System.out.println (t2);

результат:

11
12

приоритет действительно говорит, чтобы оценить ++ до +, но это не применяется, пока не достигнет этой части выражения.

ваше выражение имеет вид X + Y Где X и t1 и Y и (++t1)

в левая ветвь, т. е. X, оценивается в первую очередь. После этого правая ветвь, т. е. Y, оценивается. Только когда дело доходит до оценки Y the ++ операция выполнена.

правила приоритета только говорят, что ++ это "внутри"Y слова, они ничего не говорят о последовательности операций.

ваша логика близка, но не совсем правильно. Порядок оценки слева направо для оператора+. Т1 доходит до бинарных ОП, LHS и затем приращение на RHS этой бинарной оппозиции. Затем выполняется первой.

t2 = t1 + (++t1);
t2 = 5 + 6;      // t1 becomes 6 here as a side effect before being read on the RHS
t2 = 11;

визуализируется как дерево у вас есть,

    +
  /   \
 t1   ++t1

Приоритет

когда два оператора совместно используют операнд, оператор с более высоким приоритетом идет первым. Например, 1 + 2 * 3 обрабатывается как 1 + (2 * 3), тогда как 1 * 2 + 3 рассматривается как (1 * 2) + 3, так как умножение имеет более высокий приоритет, чем сложение.

ассоциативность

когда два оператора с одинаковым приоритетом в выражении оценивается в соответствии с его ассоциативностью. Например, x = y = z = 17 рассматривается как x = (y = (z = 17)), оставляя все три переменные со значением 17, так как оператор = имеет ассоциативность справа налево (и оператор присваивания вычисляет значение on правая сторона). С другой стороны, 72 / 2 / 3 рассматривается как (72 / 2) / 3, так как оператор / имеет ассоциативность слева направо.

другой способ думать об этом-расширить выражение++:

++t1 это то же самое, что положить t1 = t1 + 1.

1) t1 = 5;
2) t2 = t1 + (++t1); 
3) t2 = t1 + (t1 = t1 + 1), 
4) t2 = 5 + (t1 = t1 + 1)
5) t2 = 5 + (t1 = 6)
6) t2 = 5 + 6 = 11

если бы вы изменили порядок на t2 = (++t1) + t1; тогда выражение расширится до:

1) t2 = (t1 = t1 + 1) + t1     
2) t2 = (t1 = 5 + 1) + t1
3) t2 = (t1 = 6) + t1
4) t2 = 6 + 6 = 12

чтобы добавить точку в Chris K,

ассоциативность слева направо

и

t2 = t1 + (++t1);
t2 = 5 + 6;      // first t1 is replaced with 5 and then the next 6 
t2 = 11;

The + оценивается слева направо, так что

t1 + (++t1)     // Left side is evaluated to 5, right side evaluated to 6...
5  + (6)        // ...and as a side effect t1 becomes 6

результаты 11.

оценка происходит слева направо. Так что на самом деле происходит следующее

t2 = t1 + (++t1);
t2 = 5 + 6;      
t2 = 11;

значение t1 во второй строке равно 5

t2 = t1 + (++t1)
t2 = 5 + 6;      // t1 becomes 6 here

The порядок оценки слева направо.

Итак, первый t1 оценивается в 5 затем ++t1 до 6 и отсюда результат как 11

++x выполняется перед использованием переменной x, а X++ увеличивает x после ее использования:

x=5;
y=x++;
y is 5;
and x is 6

x=5;
y=++x;
y is 6;
and x is 6
t2 = t1 + (++t1);

Это эквивалентно

temp = t1 + 1
t2 =  t1 + temp;
t1= temp;
enter code here
t1 = 5;
t2 = t1 + (++t1);
// it takes 5 for t1 and as it moves further to (++t1), it increments t1 to 6, so it takes 6 for  (++t1)
t2 = 5 + 6;
// (++t1) this increments t1 by 1 then return new value. So (++t1)=6
// (t1++) this returns old value n then increments t1 by 1. So (t1++)=5