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