关于java中运算符的优先级问题

今天写算法时,碰到一个判断,有点理解不了,请大家指点。

int[] arr = new int[2];
        arr[0] = 1;
        if(arr[0]-- == 0) System.out.println("hhh");
        else System.out.println("aaa");

代码如上,问题出现在这个if判断里。idea给了提示,这个if条件是永远为false的,为什么会是false啊,--的优先级高于==,先减1再比较不是true吗?难道是先比较之后再减的1?

你说的对,是--先运算,但是自增/自减有前后之别
--在变量前面,是先减再用
--在变量后面,是先用再减

a=2

  • --a==2就是false,因为--在前,是先把a减1变成1了,再取a的值(1)与2对比
  • 而对于a--==2就是true,因为是先用a的值(2)与2对比,然后再让a自减

你说的对啊,是输出aaa

img


你的提示信息贴出来看看,是不是你理解错了。


arr[0]--表达式是减之前的值,和优先级无关
--arr[0]才是先减。

因为 -- 在后面 ,所以 arr[0]-- 这个表达式的结果就是 arr[0], 所以 1==0 , 这个结果就是 false

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    根据Java运算符的优先级列表,--运算符的优先级高于==运算符,因此条件表达式会先执行减号运算,然后再执行相等运算。但是,如果条件的初值本身就是一个常量,则条件表达式只会在编译时进行求值。在这种情况下,所谓的优先级关系就没用了。例如,在条件表达式中,如果出现i == 0,而i在之前已经被赋值为0,则条件表达式中的i == 0本身就是一个常量,它的结果为true或false,具体取决于i的初值。因此,如果你的IDE提醒你条件常量永远为false,你需要检查初始值是否正确,并确保没有被修改过。无论优先级如何,条件的结果都应该取决于变量的值,不要被常量的形式所迷惑。

    如果你需要反复评估条件表达式,并根据表达式的结果执行不同的代码,则可以考虑使用switch语句或if-else语句。例如:

    switch (i) {
        case 0:
            // if i is 0, do something
            break;
        case 1:
            // if i is 1, do something else
            break;
        default:
            // if i is neither 0 nor 1, do something else
            break;
    }
    

    或者:

    if (i == 0) {
        // if i is 0, do something
    } else if (i == 1) {
        // if i is 1, do something else
    } else {
        // if i is neither 0 nor 1, do something else
    }
    

    总的来说,关于Java运算符优先级的问题要特别小心,尤其是在条件表达式中使用常量时。如果不确定某个表达式的优先级,请用括号明确表达式的意义。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^