В 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 ответов:
вы почти правы, но вы тонко недопонимаете, как работают правила приоритета.
сравнивать эти два случая:
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