【问题标题】:Ternary Operator Limits [duplicate]三元运算符限制 [重复]
【发布时间】:2014-04-20 18:51:22
【问题描述】:

假设我们有以下 if 语句:

int a = 1;
int b = 2;

if(a < b) {
    System.out.println("A is less than B!");
}
else {
    System.out.println("A is greater or equal to B!");
}

我一直在想,如果当 if 语句由每个子块(if 和 else 块)中的一行代码组成时,如果三元运算符替换 if 语句,那么为什么上面的例子不能用三元运算符写成这样呢?

(a < b) ? System.out.println("A is less than B!") : System.out.println("A is greater or equal to B!");

【问题讨论】:

  • 因为 JLS 是这么说的:“第二个或第三个操作数表达式调用 void 方法是一个编译时错误。”跨度>

标签: java ternary-operator


【解决方案1】:

因为它不会替换 if 语句。

三元运算符只适用于表达式而不是语句,它本身就是一个表达式。

因为它是一个表达式,所以它被计算而不是被执行,并且它必须返回一个(非 void)值。该值的类型是从指定的两个可选表达式的类型推断出来的,规则是fairly complex,还有一些unexpected gotchas

(所以我通常只在最简单的情况下使用?:,以使代码易于阅读。)

【讨论】:

    【解决方案2】:

    您只能将? : 用于表达式,而不是语句。试试

    System.out.println(a < b ? "A is less than B!" : "A is greater or equal to B!");
    

    注意:这也更短/更简单。

    【讨论】:

    • 我知道这行得通,但我想知道为什么它不能像我写的三元语句那样写,但我现在知道原因了,谢谢:)
    • @AmirAl ? : 必须返回一些东西,但 println() 是一个 void 方法。
    • @PeterLawrey 我已经尝试了我提供的三元语句,当它为真时赋予值为真,当它为假时赋予值为假并且它不起作用。但必须按照您在答案中描述的方式使用它。
    • @AmirAl 它是一个表达式,而不是一个语句,因此您必须对值执行某些操作,例如将其分配给变量。
    猜你喜欢
    • 2019-07-14
    • 2011-05-05
    • 2014-09-29
    • 1970-01-01
    • 2021-04-14
    • 2015-09-27
    • 2016-02-13
    • 2015-05-21
    • 2018-08-12
    相关资源
    最近更新 更多