今天写算法时,碰到一个判断,有点理解不了,请大家指点。
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
你说的对啊,是输出aaa
arr[0]--表达式是减之前的值,和优先级无关
--arr[0]才是先减。
因为 -- 在后面 ,所以 arr[0]-- 这个表达式的结果就是 arr[0], 所以 1==0 , 这个结果就是 false
不知道你这个问题是否已经解决, 如果还没有解决的话:根据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运算符优先级的问题要特别小心,尤其是在条件表达式中使用常量时。如果不确定某个表达式的优先级,请用括号明确表达式的意义。