Java是用来评估一个确定性表达式的算法吗?请看下面的例子:Java是用来评估表达式确定性(不仅仅是确定的)的算法吗?
int x = 1 + 2 + 3;
我不要求计算的顺序,即Java的第一次评估,然后表达“2”及“1”“3”从左至右,因为它的定义由JLS在第15.7章中。 “评估订单”。
我想知道,虽然它被定义为第一个'1 + 2'被评估或虽然实现是自由的,首先评估'2 + 3'。
在此先感谢!
编辑:
我知道评估顺序在Java和该表达式的结果被确定当然被定义。我想知道结果的计算方式是如何定义的。
我试着保持这个例子尽可能简单,但显然它太简单了,不能适当地描述我的问题,所以我将通过T.J扩展这个例子。克劳德副作用:
public class Program {
public static void main (String[] args) {
int x = a() + b() + c();
System.out.println(x);
}
static int a() { System.out.println("in a"); return 1; }
static int b() { System.out.println("in b"); return 2; }
static int c() { System.out.println("in c"); return 3; }
}
输出将definetely是
in a
in b
in c
6
因为从左至右按JLS 15.7 a,b和c的评估的方法。结果将永远是6.但是VM是否有义务首先添加a的返回值和b的返回值,或者是否可以自由地获得结果? (我认为这是不以任何方式检测,并没有规定,但留下作为一个实现细节,但我不知道)
EDIT2:
问题澄清
呵呵,你的第2段回答你的第3段? JLS是每个实现都需要遵循的规范。 – Tunaki
实现可以自由地对代码进行重新排序,前提是它不会改变结果,即它必须产生与'(1 + 2)+ 3'相同的结果,尽管目前还不清楚为什么它会这样做。 –
在发布这样的问题之前,请阅读JLS有关表达评估的内容。这里全是拼出来的。 –