Java的“&&”与“&”运算符

wfveoks0  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(144)

我使用的例子来自Java,完整的参考资料由赫伯特Schildt编写,第12艾德,Java是14
他给出了以下2个示例(如果阻塞),第一个是可以的,第二个是错误的,因此进行了评论

public class PatternMatch {
    public static void main(String[] args){
        Number myOb = Integer.valueOf(9);
        int count = 10;
        if((count < 100) && myOb instanceof Integer iObj) { // is OK!!!
            iObj = count;
        }

        /*
        if((count < 100) & myOb instanceof Integer iObj) { // Error!!!
            iObj = count;
        }
        */
    }
}

他对为什么第二个if块(注解掉)的解释是“在这种情况下,编译器不能知道iObj是否会在if块的作用域中,因为&的右边不一定会被求值”。这导致了我的困惑:&确保它的左侧和右侧总是被求值,那么为什么“因为&的右侧不一定被求值”呢?
谢谢!
如果你把java 14代码放到IDE中,你会看到第二个if块产生编译错误,说iObj没有定义......但是我就是不明白他的解释:
他对为什么第二个if块的解释是“在这种情况下,编译器不能知道iObj是否会在if块的作用域中,因为&的右边不一定会被求值”。这导致了我的困惑:&确保它的左侧和右侧总是被求值,那么为什么“因为&的右侧不一定被求值”呢?

public class PatternMatch {
    public static void main(String[] args){
        Number myOb = Integer.valueOf(9);
        int count = 10;
        if((count < 100) && myOb instanceof Integer iObj) { // is OK!!!
            iObj = count;
        }

    
        if((count < 100) & myOb instanceof Integer iObj) { // Error!!!
            iObj = count;
        }
   
    }
}
kmbjn2e3

kmbjn2e31#

事实上,“正确的一面不一定会被评价”是完全错误的。
&&是法律的的,因为在if语句中,您可以绝对保证myObj instanceof Integer iObj已被求值,* 并且 * 求值为true(这样就在if块内的代码作用域中建立了iObj)给定a && b,b不一定要求值,但是如果代码流入if,b肯定已经求值了,这就是为什么你的第一个代码片段会被编译。
&在这里可能是不法律的的,因为规范并不麻烦。没有解释涉及myObj instanceof Integer iObj要么没有被求值,要么以某种方式被求值为false的情况。在if块中,它 * 将被求值,并且将被求值为true*。但是,关键是,编译器必须根据静态代码分析来确定,并且 * 该部分 * 是规范不必显式列出boolean & boolean建立明确求值(以及明确的真求值)的地方。

相关问题