Оценка логического оператора && - PullRequest
5 голосов
/ 13 марта 2012

Если у меня есть следующее заявление if

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

Где row - это значение int, а array - это int[][] объект.

Мой вопрос: если это вызовет исключение, если строка = -1, так как массив не будет иметь поля -1, то есть исключение за пределами границ? Или он остановится в первой части if, (row! = - 1) и, поскольку это ложно, он будет игнорировать остальные? Или, чтобы быть уверенным, что он не вызывает исключений, я должен разделить вышеприведенный оператор if на два?

(Пожалуйста, не говорите мне проверить это на себе :) Я спрашиваю здесь, потому что я тоже хочу задать дополнительный вопрос ...)

Ответы [ 8 ]

3 голосов
/ 13 марта 2012

Это безопасно остановится, прежде чем выдать исключение

&& - это логический оператор с коротким замыканием , который означает, что он остановит выполнение выражения, как только одна часть вернет false (поскольку это означает, что все выражение должно быть false) ,

Обратите внимание, что он также гарантированно оценивает части выражения по порядку, поэтому его безопасно использовать в таких ситуациях.

2 голосов
/ 13 марта 2012

Это не вызовет исключения. Однако, если строка <-1 (например, -2), вы столкнетесь с проблемами. </p>

1 голос
/ 13 марта 2012

Кроме того, вам может понадобиться что-то вроде следующего (или просто использовать 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;
}
1 голос
/ 13 марта 2012

Многие языки программирования имеют оценку короткого замыкания для логических операторов.

В таком выражении, как A and B, язык сначала оценивает A. Если A ложно, тогда все выражение ложно; не имеет значения, является ли B истинным или ложным.

В вашем случае, когда row равно -1, row != -1 будет ложным, и короткое замыкание выражения массива не будет оцениваться.

Кроме того, ваш второй вопрос о поведении индекса массива полностью зависит от языка. В C array[n] означает *(array + n). В python array[-1] дает вам последний элемент в массиве. В C ++ у вас может быть массив с перегруженным оператором [], который также принимает отрицательные индексы. В Java вы получите ArrayIndexOutOfBoundsException .

1 голос
/ 13 марта 2012

Большинство языков программирования замыкают тест, когда первое выражение возвращает false для теста И и true для теста ИЛИ. В вашем случае тест AND будет закорочен и исключений не будет.

1 голос
/ 13 марта 2012

Вызывается оценка короткого замыкания через &&, и если проверка строки не пройдена, нет смысла продолжать оценку.

1 голос
/ 13 марта 2012

Нет, Не будет. компилятор не будет проверять второе выражение, если первое выражение ложно ... Вот почему && называется оператором "короткого замыкания" ...

1 голос
/ 13 марта 2012

Остановится на первой части if. Java использует оценку короткого замыкания .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...