评估&&布尔运算符

时间:2012-03-13 05:42:06

标签: java if-statement

如果我有以下if语句

if ( (row != -1) && (array[row][col] != 10) ) {
    ....
}

其中rowint值且arrayint[][]个对象。

我的问题是,如果row = -1会抛出异常,因为数组不会有-1字段,那么out of bounds exception?或者它会停在if的第一部分(行!= - 1),因为这是假的,它会忽略其余部分吗? 或者为了确保它不会抛出异常,我应该将上面的if语句分成两个?

(请不要告诉我为自己检查一下:)我在这里问'因为我想问一个后续问题......)

8 个答案:

答案 0 :(得分:3)

它会在抛出异常之前安全停止

&&short-circuiting boolean operator,这意味着只要一个部分返回false,它就会停止执行表达式(因为这意味着整个表达式必须为false)。

请注意,它还保证按顺序评估表达式的各个部分,因此在这些情况下使用是安全的。

答案 1 :(得分:2)

它不会抛出异常。但是,如果行是< -1(例如-2),那么你将遇到问题。

答案 2 :(得分:1)

它会在if的第一部分停止。 Java使用short circuite evaluation

答案 3 :(得分:1)

不,它不会。如果第一个表达式为假,则编译器不会检查第二个表达式...这就是为什么&&被称为“短路”操作员...

答案 4 :(得分:1)

通过&&调用short-circuit evaluation,如果行检查失败,则继续评估没有意义。

答案 5 :(得分:1)

当第一个表达式返回false进行AND测试而true进行OR测试时,大多数编程语言都会使测试短路。在您的情况下,AND测试将被短路,并且不会发生异常。

答案 6 :(得分:1)

许多编程语言对于逻辑运算符都有short-circuit evaluation

A and B等语句中,语言将首先评估A。如果A为false,则整个表达式为false;无论B是真还是假都没关系。

在您的情况下,当row等于-1时,row != -1将为false,并且不会评估数组表达式的短路。

此外,关于数组索引行为的第二个问题完全取决于语言。在C中,array[n]表示*(array + n)。在python中,array[-1]为您提供数组中的最后一项。在C ++中,您可能有一个带有重载[]运算符的数组,该运算符也接受负索引。在Java中,您将获得ArrayIndexOutOfBoundsException

答案 7 :(得分:1)

此外,您可能需要以下内容(或使用try / catch)。

boolean isItSafe(int[][] a, int x, int y) {
    boolean isSafe = true;
    if (a == null || a.length == 0 || x >= a.length || x < 0 || y < 0 || y >= a[0].length ) {
        isSafe = false;
    }
    return isSafe;
}