Java 函数被评估了多少次?
如果有这样的三元条件:Java 函数被评估了多少次?,java,Java,如果有这样的三元条件: (sum(a,b) > sum(b,c) ? sum(a,b) : sum(b,c)) 这样写是否高效、干净?sum(a,b)或sum(b,c)是否计算了两次?我该如何改进这一点 是的,它被评估了两次(嗯,可能有一些我不知道的(JIT)编译器/JVM优化,但你不能依赖于此) 计算三元运算符之前的值: int sumAB = sum(a, b); int sumBC = sum(b, c); sumAB > sumBC ? sumAB : sumBC;
(sum(a,b) > sum(b,c) ? sum(a,b) : sum(b,c))
这样写是否高效、干净?
sum(a,b)
或sum(b,c)
是否计算了两次?我该如何改进这一点 是的,它被评估了两次(嗯,可能有一些我不知道的(JIT)编译器/JVM优化,但你不能依赖于此)
计算三元运算符之前的值:
int sumAB = sum(a, b);
int sumBC = sum(b, c);
sumAB > sumBC ? sumAB : sumBC;
当然,对于一个简单的总和来说,差别可以忽略不计。但这通常是一个很好的做法。是的,它们将被评估两次 您可以这样做:
int x, y;
((x = sum(a,b)) > (y = sum(b,c))) ? x : y;
如果您真的想使用三元运算符。对于这个特殊问题,您最好使用Math.max()而不是自己编写三元表达式逻辑。是的,它将被计算两次,也不容易维护。您需要重构方法调用。似乎“b”是无条件的
sum(b, Math.max(a, c))
@Bozho,@Ralph:也许问题在于三元运算符是否有延迟求值。不是这个特别的usage@Goran-也许是的,但我认为答案至少值得投一票也许没有那么多;)这甚至没有保存字符(至少没有太大意义;使用
max
函数的长度可能差不多,甚至更短)。这真是太糟糕了。@unbeli:任何人想要使用三元运算符的唯一两个好理由是:1)如你所说,为了节省源代码字节,2)如果他们想将其if-else
作为要计算的表达式来编写。这个答案适用于两种情况。第一个是显而易见的,第二个我甚至把赋值当作一个表达式。我猜这个问题是关于探索一种语言的特性,所以这是一个奇特的答案。