关于编译器的代码说明评估顺序

问题描述 投票:2回答:1

[从在线信息中,我已经收集到,求值顺序是在操作数的左边在右边进行评估。但是,当在网上查找时,这也类似于短路,因为这也在左侧之前评估右侧。我的代码下面表示短路,但是希望显示评估顺序。有谁知道在下面的代码中需要进行哪些更改才能按照评估顺序显示代码,而不是在编译器中运行时当前显示为短路的代码。编译器使用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;
}

}
java compiler-errors compiler-construction operator-precedence
1个回答
0
投票

我不确定我是否理解您对这个问题的答复。

但是很容易描述短路评估和严格评估顺序之间的差异。

考虑声明:

b = f(a) + g(a)

[使用一种保证从左到右严格的评估顺序的语言(例如Java),然后将在函数f之前调用函数g,但*总是会调用这两个函数。

另一方面,带有表达式

b = f(a) || g(a)

f将首先被调用,但是很有可能不会被调用g。如果返回真值,则可以在f返回后停止评估。

也有一些语言(例如C)不能保证从左到右的求值。在这些语言中,当评估f(a) + g(a)时,可能会在g之前调用f。但是短路评估(使用布尔运算符)的作用相同,因为必须严格执行短路评估的要求。

© www.soinside.com 2019 - 2024. All rights reserved.