1

在 Java 中,如果我在常规 if 中使用三元 if 运算符,例如:

if ((x > y - z) ? true : callLongWaitedMethod(many, parameteres)) {
        loveTeddyBear();
}

x > y - z如果确实是真的,它会执行 callLongWaitedMethod吗?我希望不是这样,我可以使用这个漂亮的语句,乍一看有点复杂,但与额外的布尔变量相比更有吸引力:

boolean b = (x > y - z) ? true : callLongWaitedMethod(many, parameteres);
if (b) {
        loveTeddyBear();
}

特别是如果我在一个反复迭代的大循环中使用它,所以从性能的角度来看,每次创建布尔值都不会很好,而如果我在循环之外声明布尔值,我可能会因为循环的大尺寸。

4

6 回答 6

6

这将如您所愿,但简单地使用普通||运算符来完成完全相同的结果会更清楚:

if ((x > y - z) || callLongWaitedMethod(many, parameteres)) {
        loveTeddyBear();
}
于 2012-07-18T11:39:52.160 回答
3

根据Java 语言规范 15.25,只有在必要时才会评估 long 方法:

未选择的操作数表达式不会针对条件表达式的特定评估进行评估。

于 2012-07-18T11:41:01.600 回答
2

callLongWaitedMethod如果为真,则不会被调用。x > y - z

于 2012-07-18T11:34:21.023 回答
0

如果你想执行callLongWaitedMethodwhen (x > y - z)is true 你实际上必须交换表达式:

if ((x > y - z) ? callLongWaitedMethod(many, parameteres) : true ) {
        loveTeddyBear();
}
于 2012-07-18T11:38:12.647 回答
0

好像你有你想要的答案。您也可以只使用带有简单版本代码的调试语句来查看执行了什么来验证行为。就像是

if ((1 > 2) ? true : someSimpleMethod()) {
    System.out.println("true if");
}

正如你someSimpleMethod()所拥有的

public boolean someSimpleMethod() {
    System.out.println("calling someSimpleMethod()");
    return true;
}

从那里您可以交换 1 和 2 以查看是否someSimpleMethod()会执行。

于 2012-07-18T12:05:30.670 回答
0

作为编码员,你应该问问自己,如果你不知道它会做什么,你真的应该这样编码吗?为什么不只是这样:

if ( (x>y-z) || 
     (x<=y-z && callLongWaitedMethod(many, parameteres))) {
    loveTeddyBear();
}

对于不熟悉您的代码的新手程序员来说,这将更有意义。

于 2012-07-18T12:38:54.543 回答