澄清有关编译器评估顺序的代码
Clarification on code regarding compilers Order of Evaluation
根据我收集到的在线信息,评估顺序是先评估操作数的左侧,然后再评估右侧。然而,当在线查看时,这也类似于短路,因为它也是先评估左侧再评估右侧。在我的代码下方代表短路但是希望它显示评估顺序。有谁知道下面代码中需要更改什么以根据评估顺序显示代码,而不是在我的编译器中 运行 时当前显示为短路的代码。编译器使用 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
returns 之后可以停止评估,如果它 returns 是一个真值。
还有一些语言(例如 C)不保证从左到右求值。在这些语言中,当计算 f(a) + g(a)
时,可能会在 f
之前调用 g
。但短路评估(使用布尔运算符)的工作原理相同,因为短路评估必须严格排序。
根据我收集到的在线信息,评估顺序是先评估操作数的左侧,然后再评估右侧。然而,当在线查看时,这也类似于短路,因为它也是先评估左侧再评估右侧。在我的代码下方代表短路但是希望它显示评估顺序。有谁知道下面代码中需要更改什么以根据评估顺序显示代码,而不是在我的编译器中 运行 时当前显示为短路的代码。编译器使用 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
returns 之后可以停止评估,如果它 returns 是一个真值。
还有一些语言(例如 C)不保证从左到右求值。在这些语言中,当计算 f(a) + g(a)
时,可能会在 f
之前调用 g
。但短路评估(使用布尔运算符)的工作原理相同,因为短路评估必须严格排序。