Я бы предположил, что это может оценить что-то подобное, оценивая слева направо.
a + b * c / (de)
Action Left Value Right Value
Start Add a b*c/(d-e)
Start Multiply b c
Calc Multiply (since it can)
Start Divide b*c (d-e)
Start Subtract d e
Calc Subtract
Calc Divide
Calc Add
Это можно рассматривать как созданиедвоичное дерево, представляющее вычисления и затем работающее от конечных узлов, слева направо, вычисляющих вещи.К сожалению, мое искусство ascii не велико, но вот попытка изобразить дерево, о котором идет речь:
Add
/\
/ \
a \
Divide
/ \
/ \
/ \
/ \
Multiply Subtract
/\ /\
/ \ / \
b c d e
И я провел несколько тестов в C # (я знаю, что это не то же самое, но в этом мои интересы итесты могут быть легко адаптированы) следующим образом:
f = 1;
Console.WriteLine((f=2) + (f) * (f) / ((f) - (f)-1));
Console.WriteLine(2 + 2 * 2 / (2 - 2 - 1));
f = 1;
Console.WriteLine((f) + (f=2) * (f) / ((f) - (f)-1));
Console.WriteLine(1 + 2 * 2 / (2 - 2 - 1));
f = 1;
Console.WriteLine((f) + (f) * (f = 2) / ((f) - (f)-1));
Console.WriteLine(1 + 1 * 2 / (2 - 2 - 1));
f = 1;
Console.WriteLine((f) + (f) * (f) / ((f=2) - (f)-1));
Console.WriteLine(1 + 1 * 1 / (2 - 2 - 1));
f = 1;
Console.WriteLine((f) + (f) * (f) / ((f) - (f=2)-1));
Console.WriteLine(1d + 1d * 1d / (1d - 2d - 1d));
Пары операторов console.writeline являются алгебраическими (с использованием набора числовых трюков) и числовым представлением, показывающим, что фактически выполняет вычисление.Пары дают одинаковый результат друг с другом.
Как видно, аргументы оцениваются по порядку, причем любые после присваивания равны 2, а те, что перед единицами.Так что порядок оценки вещей прост слева направо, я думаю, но порядок вычислений такой, как вы ожидаете.
Я предполагаю, что это можно выполнить почти с копированием и вставкой для тестирования в JAVA ...
Здесь могут быть некоторые незамеченные предположения, поэтому, если кто-то обнаружит здесь недостатки логики, пожалуйста, позвонитея на них, и я проработаю их.