我想它可能会从左到右评估类似这样的东西。
a+b*c/(d-e)
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,而分配前的参数都是1。因此,我认为事物的评估顺序是简单的从左到右,但计算顺序是您所期望的。
我认为这几乎可以通过复制和粘贴在JAVA中测试...
如果有人发现这里存在逻辑缺陷,请指出来,我会加以解决。