【问题标题】:Ternary operator with constant variable in return statement. return a>b?a:b + 1; or return 1 + a>b?a:b;在 return 语句中具有常量变量的三元运算符。返回 a>b?a:b + 1;或返回 1 + a>b?a:b;
【发布时间】:2015-11-22 05:05:53
【问题描述】:
public static int test(){
        int a = 0;
        int b = 0;      
        return a>b?a:b + 1;
}

结果是 1。

public static int test(){
        int a = 0;
        int b = 0;      
        return 1 + a>b?a:b;
}

结果为 0。

怎么会??????

编辑 我修复了代码示例中的错误。

【问题讨论】:

  • 为什么完全相同的方法会给出两个不同的结果?这对上帝来说也是个谜!

标签: java return operator-keyword ternary


【解决方案1】:

这是Java中操作顺序的结果。查看此Java Operators 帖子以获取运算符优先级列表。

第一条语句的计算结果如下:

=> a > b ? a : b + 1
-> 0 > 0 ? 0 : (0 + 1) 
// 0 is not greater than 0 therefore return 'b+1' which is 1
-> 1 

您的第二个语句的计算结果如下:

=> 1 + a > b ? a : b
-> (1 + a) > b ? a : b
-> (1 + 0) > 0 ? 0 : 0
// 1 is greater than zero therefore return 'a' which is 0
-> 0

对于第二条语句,“加法”运算1 + a 优先于“关系”运算> b

同样,请阅读上面的 Java 运算符链接以获取更多信息。

【讨论】:

  • 感谢您的插图!太棒了!
【解决方案2】:

你可能认为

return a>b?a:b + 1;

等价于

return (a>b?a:b) + 1;

但事实并非如此。相当于

return a>b?a:(b + 1);

同样的问题

return 1 + a>b?a:b;

确实如此

return (1 + a)>b?a:b;

【讨论】:

    【解决方案3】:

    根据问题的标题,显然两个test() 方法之一应该是

    public static int test(){
            int a = 0;
            int b = 0;      
            return 1+a>b?a:b;
    }
    

    在这种情况下,假设ab 设置为0,则结果将始终为a(即0),而与最后一个术语无关(即,即使如果不是b 而是b + 1 或其他)。

    显然1 + a = 1 + 0 = 11 > a,所以结果是a,即0

    【讨论】:

    • 感谢您的解释!!
    【解决方案4】:

    return a>b?a:b + 1中,a>b?a:b首先被评估;因为a不大于b,所以返回b + 1的值,即1。

    return 1 + a>b?a:b 中,编译器将条件视为(1 + a) > b。既然是真的,就返回a的值,也就是0。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多