Я решил написать ответ, потому что там есть gotcha , который не связан с приоритетом оператора (см. Шаг 3).
Шаг 0: Входное выражение -
x++ - y * 7 / --y + x * 10;
Шаг 1: С точки зрения приоритета оператора, приращение / уменьшение имеют более высокий приоритет, чем умножение / деление, а умножение / деление имеет более высокий приоритет, чем сложение / вычитание, поэтому добавьте несколько скобок, чтобы уточнить, что -
(x++) - (y * 7 / (--y)) + (x * 10);
Шаг 2: Следующее, что нужно сделать, это заменить переменные значениями с учетом того, как работают операторы до / после увеличения / уменьшения -
20 - (10 * 7 / 9) + (21 * 10)
// ^ ^ ^
// | Pre-1 |
// | |
// + -----------------Post+1
Шаг 3: Единственное, что не связано с приоритетом оператора: выполнение операции над целочисленными операндами дает целочисленный результат, даже если результат выражения присваивается типу с плавающей запятой. Следовательно, 10 * 7 / 9
дает 7
-
20 - (7) + (210)
Шаг 4: Выражения вычисляются слева направо -
20 - 7 + 210
13 + 210
223
Шаг 5: Целочисленный результат присваивается double
-
223.0