Подтвердить что ты не робот

В 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. Может кто-нибудь объяснить?

4b9b3361

Ответ 1

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

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

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, выполняется операция ++.

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

Ответ 2

Ваша логика близка, но не совсем правильная. Порядок оценки слева направо для оператора+. t1 идет перед двоичным оператором, LHS, а затем инкремент находится на RHS этого двоичного операнда. Сначала выполняется LHS.

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, так как оператор = имеет правовариантность слева (и оператор присваивания оценивает к значению с правой стороны). С другой стороны, 72/2/3 рассматривается как (72/2)/3, так как оператор/имеет лево-правую ассоциативность.

Ответ 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

Ответ 4

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

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

Итак,

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

Ответ 5

+ оценивается слева направо, поэтому

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

Результаты в 11.

Ответ 6

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

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

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

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

Ответ 7

оценка происходит слева направо. Итак, что происходит после

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

Ответ 8

++ 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

Ответ 9

t2 = t1 + (++t1);

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

temp = t1 + 1
t2 =  t1 + temp;
t1= temp;

Ответ 10

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