2016-04-17 37 views
-4

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:

问题澄清

+1

呵呵,你的第2段回答你的第3段? JLS是每个实现都需要遵循的规范。 – Tunaki

+1

实现可以自由地对代码进行重新排序,前提是它不会改变结果,即它必须产生与'(1 + 2)+ 3'相同的结果,尽管目前还不清楚为什么它会这样做。 –

+2

在发布这样的问题之前,请阅读JLS有关表达评估的内容。这里全是拼出来的。 –

回答

1

是算法的Java用来评估表达式的确定性?

当然是了。编程语言是确定性的,这是相当重要的。别的,混乱。 (让我们离开量子计算到一边......)

yshavit正确地指出,1 + 2 + 3实际上是一个constant expression等样在自己的类别。相反,让我们假设三个变量:

int x = a + b + c; 

如果你问是否可以JVM,确定性,做了评价以不同的顺序,它是免费提供的差异无法观察

让我们来扩展你的例子:

int x = f1() + f2() + f3(); 

...其中f1f2f3都有副作用。

除非JVM可以证明f1f2f3有没有副作用,它has to call f1 first

15.7.1。先评估左手操作数

二元运算符的左侧操作数在评估右侧操作数的任何部分之前似乎已完全评估。

考虑到f1可能会影响返回值f2;或者他们可能有输出等。

JVM可以首先评估b + c,因为没有副作用,但它不能首先评估f2() + f3(),除非它确实知道没有副作用。

但这仍然是确定性的。

+0

编程语言在所有情况下都是确定性的并不重要,有时候允许它是非确定性的(或类似的)。通常情况下,你会希望程序员编程的方式会产生正确的结果(确定性或不确定性)。顺便说一句,也有应用程序的非确定性行为呢.. – skyking

+0

@skyking:我认为你* *确定性*运行时确定性混淆*语言*确定性。一种语言将有明确的规则。某些操作可能在运行时表现出非确定性效果(来自用户的阅读输入就是一个很好的例子),但这不是确定性的*语言*。我可以用* language *术语思考的唯一非确定性的例子是* undefined behavior *。 –

+0

仍然有语言允许他们没有定义特定结果的构造或情况。也可能是结果仅限于指定的范围(例如浮点计算的结果)。这并不意味着语言不可用,并不意味着混乱注定会出现。 – skyking

相关问题