Java 关于编译器评估顺序代码的澄清

Java 关于编译器评估顺序代码的澄清,java,compiler-errors,compiler-construction,operator-precedence,Java,Compiler Errors,Compiler Construction,Operator Precedence,从网上的信息中,我收集到的求值顺序是先求值操作数的左侧,再求值右侧。然而,当在线查看时,这也类似于短路,因为这也是先评估左侧再评估右侧。下面我的代码表示短路,但我希望它显示评估顺序。有人知道下面的代码中需要更改什么,才能按照求值顺序显示代码,而不是在我的编译器中运行时,当前显示为短路的代码。编译器使用Minijava class ImpFact{ public static void main(String[] a){ System.out.println(new Fac().C

从网上的信息中,我收集到的求值顺序是先求值操作数的左侧,再求值右侧。然而,当在线查看时,这也类似于短路,因为这也是先评估左侧再评估右侧。下面我的代码表示短路,但我希望它显示评估顺序。有人知道下面的代码中需要更改什么,才能按照求值顺序显示代码,而不是在我的编译器中运行时,当前显示为短路的代码。编译器使用Minijava

class ImpFact{
    public static void main(String[] a){
    System.out.println(new Fac().ComputeFac(10));
    }
}

class Fac {

    public int ComputeFac(int num){
    boolean a;
    boolean b;
    int result;

    a = false;
    b = false;

    if (a || b) {
    result = 3;
    }
    else {
    result = 7;
}
    return result;
}

}

我不确定我是否理解你对这个问题的回答

但很容易描述短路评估和严格评估顺序之间的区别

考虑以下陈述:

b = f(a) + g(a)
在保证严格的从左到右求值顺序的语言中(如Java),则函数
f
将在函数
g
之前被调用,但*始终会调用这两个函数

另一方面,用

b = f(a) || g(a)
将首先调用
f
,但很可能不会调用
g
。如果
f
返回真值,则可以在返回后停止计算


还有一些语言,比如C,不能保证从左到右的计算。在这些语言中,当计算
f(a)+g(a)
时,有可能在
f
之前调用
g
。但是短路评估(使用布尔运算符)同样有效,因为短路评估必须严格排序。

根据问题中给出的java代码,如何更改评估顺序以显示当前短路?@RyanReynolds:当前短路情况如何?据我所知,短路是在运算符在右前求值。因此,如果A为false,那么B必须为false,但是现在考虑一下,会使用&&表达式吗?@RyanReynolds:短路计算是指对左侧参数的计算可能导致右侧参数未被计算。例如,
如果(a==0 | | b/a>0.5)
。由于短路计算,该表达式是安全的。如果
a
为0,则不能对
b/a
进行求值。是否可以使用给定的信息对问题中的代码进行编辑。当a和b都是布尔类型时,不确定如何实现if语句。