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