使用三元运算符时的括号

时间:2016-08-22 21:49:15

标签: java

为什么以下两种情况的输出不同?这是我调试的一个更大问题的一部分,并缩小到问题

public static void main(String[] args) {    

        String test = "hello";
        System.out.println(call() + test.charAt(0)=='h'?1:0);
    }

static int call()
    {
        return 1;
    }
  

输出:0

但如果我添加一个paranthesis,我会得到预期的输出

public static void main(String[] args) {    

        String test = "hello";
        System.out.println(call() + (test.charAt(0)=='h'?1:0));
    }

static int call()
    {
        return 1;
    }
  

输出:2(按预期)

在初始调用中,call()+ test.charAt(0)是否针对'h'进行了评估,并相应地分配了1和0?这意味着{1 + ascii值'h'} == 105是针对'h'的ascii值进行评估的,这是104?

2 个答案:

答案 0 :(得分:4)

实际上没有问题,运营商有不同的优先顺序。

如果您查看评论中添加Andy Turner的链接,您会找到此表

enter image description here

正如您所看到的,additive+-)优先于三元运算符。 这就是原因:

call() + test.charAt(0)=='h'?1:0
^^^^^^^^^^^^^^^^^^^^^^^
  High precedence      
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       Less precedence

因此,您可以使用括号更改优先顺序:

call() + (test.charAt(0)=='h'?1:0)
          ^^^^^^^^^^^^^^^^^^^^^^^
              High precedence      
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       Less precedence

答案 1 :(得分:2)

重点不在于您的三元运算符,而是+==之前的事实:

call() + test.charAt(0)=='h'?1:0

在任何等同于

的读数中
(call() + test.charAt(0)) == 'h'?1:0

此外,==的优先级高于?,因此等于

((call() + test.charAt(0)) == 'h') ? 1 : 0