【问题标题】:Java Ternary operator syntax [duplicate]Java三元运算符语法[重复]
【发布时间】:2015-03-25 13:49:23
【问题描述】:

我有以下代码。我是这样理解的。

在第一种情况下,三元运算符返回 y 的值,因为 x=4 和 print 语句按预期打印 5

在第二种情况下,三元运算符首先将 y 的值赋给 x,然后返回该值。同样,它按预期打印 5。

在第三种情况下,三元运算符在 : 的左侧有 x=y,在 : 的右侧有 x=z。我希望这与第二种情况非常相似。但是,此语句甚至无法编译。

任何有助于理解这一点的帮助将不胜感激。

public class Test {

    public static void main(String[] args) {
        int x = 4;
        int y = 5;
        int z = -1;

        x = (x == 4) ? y : z;        // compiles and runs fine
        System.out.println(x + " " + y + " " + z);

        x = (x == 4) ? x = y : z;    // compiles and runs fine
        System.out.println(x + " " + y + " " + z);

        x = (x == 4) ? x = y : x = z;  // Does not compile
        System.out.println(x + " " + y + " " + z);
    }
}

【问题讨论】:

  • x = (x==4)?(x=y):(x=z);x = (x==4)?x=y:(x=z); 都可以。

标签: java syntax ternary-operator


【解决方案1】:

赋值的优先级低于三元表达式,所以这个表达式:

(x==4)?x=y:x = z;

可以认为是:

((x==4)?x=y:x) = z;

这显然不会编译,因为您不能为不是变量的东西赋值。

【讨论】:

    【解决方案2】:

    加括号控制求值顺序

    x = (x == 4) ? (x = y) : (x = z); // Does compile.
    

    注意以上等价于

    if (x == 4) {
        x = (x = y);
    } else {
        x = (x = z);
    }
    

    将值分配给x 会(作为副作用)将分配给x 的值分配给x。换句话说,你的三元相当于

    x = (x == 4) ? y : z;
    

    if (x == 4) {
       x = y;
    } else {
       x = z;
    }
    

    三元在JLS-15.25. Conditional Operator ? :中指定。

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 2015-09-07
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2019-07-14
      • 2011-05-05
      相关资源
      最近更新 更多