&& (AND) и || (ИЛИ) в заявлениях IF

Попробуйте что-то вроде этого:

ul {
  list-style-type: none;
  padding: 0;
}

.page_item_has_children {
  position: relative;
}

ul.children {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  padding: 0;
  min-width: 200px; /* or whatever makes sense */
}

ul.children li {
  height: 60px;
}

.page_item_has_children:hover > ul.children {
  display: block;
}

Важным моментом здесь является то, что элемент 'page_item_has_children' относительно позиционируется и что дочерний элемент ul 'абсолютно позиционирован.

JS Fiddle

125
задан Amr 30 March 2018 в 15:11
поделиться

8 ответов

Нет, не будет оцениваться. И это очень полезно. Например, если вам нужно проверить, не является ли String не пустым или пустым, вы можете написать:

if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}

или, наоборот,

if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}

Если бы у нас не было «коротких замыканий» в Java, мы бы получить много исключений NullPointerExceptions в приведенных выше строках кода.

190
ответ дан 24 November 2019 в 00:57
поделиться

No it will not be checked. This behaviour is called short-circuit evaluation and is a feature in many languages including Java.

26
ответ дан 24 November 2019 в 00:57
поделиться

Нет, если a истинно (в тесте или ), b не будет проверяться, так как результат теста всегда будет истинным, независимо от значения выражения b.

Сделайте простой тест:

if (true || ((String) null).equals("foobar")) {
    ...
}

не вызовет исключение NullPointerException !

6
ответ дан 24 November 2019 в 00:57
поделиться

Все ответы здесь отличные, но просто для иллюстрации откуда это взялось, для подобных вопросов лучше обратиться к источнику: Спецификации языка Java.

Раздел 15:23, Оператор условного И (&&) , говорит:

Оператор && как & (§15.22.2), но вычисляет свой правый операнд, только если значение его левого операнда истинно. [...] Во время выполнения сначала оценивается выражение левого операнда [...], если результирующее значение ложно, значение условного выражения и выражения ложно, а выражение правого операнда не оценивается . Если значение левого операнда истинно, то вычисляется правое выражение [... ] результирующее значение становится значением условного выражения и. Таким образом, && вычисляет тот же результат, что и & для логических операндов. Он отличается только тем, что выражение правого операнда вычисляется условно, а не всегда.

И аналогично, Раздел 15:24, Оператор условного ИЛИ (||) , говорит:

|| оператор похож на | (§15.22.2), но оценивает свой правый операнд, только если значение его левого операнда ложно. [...] Во время выполнения сначала вычисляется выражение левого операнда; [...] если результирующее значение истинно, значение выражения условного ИЛИ истинно, а выражение правого операнда не оценивается. Если значение левого операнда ложно, то вычисляется правое выражение; [... ] результирующее значение становится значением выражения условного ИЛИ. Таким образом, || вычисляет тот же результат, что и | для логических или логических операндов. Он отличается только тем, что выражение правого операнда вычисляется условно, а не всегда.

Возможно, немного повторяется, но лучшее подтверждение того, как именно они работают. Аналогичным образом условный оператор (? :) оценивает только соответствующую «половину» (левая половина, если значение истинно, правая половина, если оно ложно), позволяя использовать такие выражения, как:

int x = (y == null) ? 0 : y.getFoo();

без исключения NullPointerException.

20
ответ дан 24 November 2019 в 00:57
поделиться

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

Интересным фактом является то, что Java также использует & ] и | в качестве логических операндов (они перегружены, с типами int они являются ожидаемыми побитовыми операциями) для оценки всех терминов в выражении, что также полезно, когда вам нужно побочные эффекты.

4
ответ дан 24 November 2019 в 00:57
поделиться

Нет, не будет, Java выполнит короткое замыкание и прекратит оценку, как только узнает результат.

4
ответ дан 24 November 2019 в 00:57
поделиться

В Java есть 5 различных логических операторов сравнения: &, &&, |, ||, ^

& и && являются операторами "и", | и || Операторы "или", ^ равно "xor"

Отдельные операторы будут проверять каждый параметр, независимо от значений, перед проверкой значений параметров. Двойные сначала проверят левый параметр и его значение, и если истина ( || ) или ложь ( && ) оставит второй нетронутый. Звук компилированный? Простой пример должен прояснить:

Дано для всех примеров:

 String aString = null;

И:

 if (aString != null & aString.equals("lala"))

Оба параметра проверяются перед выполнением оценки, и для второго параметра будет выбрано исключение NullPointerException.

 if (aString != null && aString.equals("lala"))

Первый параметр проверяется и возвращает false , поэтому второй параметр не будет проверяться, потому что результат в любом случае будет false .

То же самое для OR:

 if (aString == null | !aString.equals("lala"))

вызовет исключение NullPointerException тоже.

 if (aString == null || !aString.equals("lala"))

Первый параметр проверяется, и он возвращает true , поэтому второй параметр не будет проверяться, потому что результат в любом случае будет true .

XOR может не подлежит оптимизации, поскольку зависит от обоих параметров.

65
ответ дан 24 November 2019 в 00:57
поделиться

Это восходит к основному различию между & и &&, | и ||

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

Z z2 = partialHits.get(req_nr).get(z); // assuming a value cannout be null.
Z z3 = tmpmap.get(z); // assuming z3 cannot be null.
if(z2 == null || z2 < z3){   
    partialHits.get(z).put(z, z3);   
} 
0
ответ дан 24 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: