Java的渴望评估:这个例子是如何工作的?
如果我有一个Java方法:Java的渴望评估:这个例子是如何工作的?,java,lazy-evaluation,Java,Lazy Evaluation,如果我有一个Java方法: public void foo (int a) { //do something } 然后我把这个方法叫做: foo (2/0) or foo (2/4) 什么时候对2/0或2/4进行评估?在输入函数之前是否对其进行了评估?还是在调用函数之前对其进行求值?(那么它是在函数内部还是外部进行评估?) 此外,考虑: if (true) then { A } else { B } 我知道你会被评估的。然而,即使java是一种渴望的语言,B也不会被计算 谢谢
public void foo (int a)
{
//do something
}
然后我把这个方法叫做:
foo (2/0) or foo (2/4)
什么时候对2/0
或2/4
进行评估?在输入函数之前是否对其进行了评估?还是在调用函数之前对其进行求值?(那么它是在函数内部还是外部进行评估?)
此外,考虑:
if (true) then { A } else { B }
我知道你会被评估的。然而,即使java是一种渴望的语言,B也不会被计算
谢谢大家! foo(2/0)
或foo(2/4)
可能由编译器计算并由常量结果替换(尽管前者在运行时会导致算术异常
,因此我不确定编译器如何处理它。通常,foo(a/b)
将在a/b
的结果传递给foo
之前进行评估
在您的
if
语句中,如果条件为真,则不会对B进行评估,这是正确的。问题1:
if (true)then{ A } else { B }
类型在编译时已检查,表达式在运行时求值。表达式先求值,然后方法调用
例如:
foo (2/0)
这样编译很好,在运行时计算表达式时会出现异常
问题2:
if (true)then{ A } else { B }
B不会计算。这就是条件表达式的工作方式。计算这两个表达式没有意义。这段代码不是Java。如果发布Java代码,请确保它首先编译!Java使用按值调用机制,即当您调用使用惰性计算策略的函数时,首先计算参数,然后将其传递给fu不协调ᴜʀᴇsʜᴀᴛᴛᴀ 嗯,我在我的Eclipse IDE中尝试了这段代码,它在运行时编译并抛出一个异常。我猜编译器没有对其进行优化。是的。很公平。在这里也尝试过。:)在运行时,2/4在函数内部或外部求值?公共void foo(inta){a+1}。当它进入方法内部并执行a+1时,a已经是0.5或仍然是未计算的2/4?@Sonya它是在方法外部计算的。该方法实际上会得到0,而不是0.5,因为它是int的一个除法,结果是int。