С Операторы :
Операнды в выражении вычисляются слева направо. Например, в F(i) + G(i++) * H(i)
метод F
вызывается с использованием старого значения i
, затем метод G
вызывается со старым значением i
и, наконец, метод H
вызывается с новое значение i
. Это отдельно от приоритета оператора и не связано с ним.
Применяя это к вашему выражению ++x - x++
, мы видим, что сначала ++x
вычисляется, затем x++
вычисляется, затем вычитание оцененный.
Хороший способ думать о приоритетах операторов состоит в том, что операторы с более высоким приоритетом связываются более тесно , чем операторы с более низким приоритетом. Он используется при определении, в каких выражениях должна быть проанализирована последовательность символов, а не в порядке, в котором они оцениваются.
Например, в выражении ++ x - x ++
оператор ++x
связывается более тесно, чем оператор -
и оператор x++
связываются более тесно, чем оператор -
, поэтому он анализируется как (++x) - (x++)
. Если бы оператор -
имел более высокий приоритет, чем операторы ++x
или x++
, это выражение было бы проанализировано как ++(x - x)++
(что не имело бы особого смысла).
Тот факт, что ++x
имеет более высокий приоритет, чем x++
здесь не имеет значения. имеет значение для выражения ++x++
, которое анализируется как (++x)++
вместо ++(x++)
(и вызывает ошибку компилятора, поскольку оператор x++
нельзя применить к выражению (++x)
).
Как только вы использовали правила приоритета операторов, чтобы выяснить, что ++ x - x ++
должен быть проанализирован как (++x) - (x++)
, применяются приведенные выше правила, а операнды выражения -
оценивается слева направо.