三元运算符如果运算符在常规内

时间:2012-07-18 11:30:59

标签: java if-statement ternary-operator

在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();
}

特别是如果我在一个反复遍历的大循环中使用它,那么从性能的角度来看每次创建布尔值都不会很好,而如果我在循环外声明布尔值,我可能会错过整齐因为循环的大小。

6 个答案:

答案 0 :(得分:6)

这将按照您的希望工作,但只需使用普通的||运算符来完成相同的结果就更清楚了:

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

答案 1 :(得分:3)

根据Java Language Specification 15.25,只有在必要时才会评估长方法:

  

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

答案 2 :(得分:2)

如果callLongWaitedMethod为真,

x > y - z 将被调用。

答案 3 :(得分:0)

如果你想在callLongWaitedMethod为真时执行(x > y - z),你实际上必须交换表达式:

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

答案 4 :(得分: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()是否会执行。

答案 5 :(得分:0)

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

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

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