【问题标题】:Eager evaluation for Java: How does this example work?渴望评估 Java:这个例子是如何工作的?
【发布时间】:2014-10-31 06:14:34
【问题描述】:

如果我有 Java 方法:

public void foo (int a)
{
    //do something
}

那我调用这个方法:

foo (2/0)  or foo (2/4)

2/02/4 何时得到评估?在进入函数输入之前是否对其进行了评估?还是在调用函数之前对其进行评估? (那么它是在函数内部还是外部评估?)


此外,考虑:

if  (true) then { A } else { B }

我知道 A 将被评估。但是,即使 java 是一种渴望的语言,B 也不会被评估?

谢谢!

【问题讨论】:

  • 此代码不是 Java。如果您发布 Java 代码 - 请确保它首先编译!
  • java 使用按值调用机制,即当你调用一个使用惰性求值策略的函数时,首先对参数进行求值,然后将其传递给函数。

标签: java lazy-evaluation


【解决方案1】:

foo (2/0)foo (2/4) 可能由编译器评估并替换为常量结果(尽管前者应该在运行时导致 ArithmeticException,所以我不确定编译器如何处理它。一般来说, foo(a/b) 将在 a/b 的结果传递给 foo 之前进行评估。

在您的if 语句中,如果条件为真,则不会评估 B 是正确的。

【讨论】:

  • @sᴜʀᴇsʜᴀᴛᴛᴀ 好吧,我在 Eclipse IDE 中尝试了代码,它编译并在运行时抛出异常。我猜编译器没有优化它。
  • 是的。很公平。这里也试过。 :)
  • 在运行时,2/4 在函数内部还是外部计算?公共无效 foo (int a){a+1}。当它进入方法内部并执行 a+1 时,a 已经为 0.5 或仍未计算 2/4 ?
  • @Sonya 它是在方法之外进行评估的。该方法实际上会得到 0,而不是 0.5,因为它是整数的除法,结果是整数。
【解决方案2】:

问题1:

类型已在编译时检查,表达式在运行时计算。表达式先求值,然后调用方法。

例如:

foo (2/0)

编译得很好,并且在运行时评估表达式时会出现异常。

问题2:

if (true)then{ A } else { B }

B 不会评估。这就是条件表达式的工作原理。评估这两个表达式没有意义。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2021-10-05
    • 2017-11-26
    • 2021-10-14
    相关资源
    最近更新 更多