Вопрос про IF, AND и OR. Без привязки к языку

Вообще у меня 2 вопроса, но они очень схожи меж собой.
Допустим что у нас есть некоторый, синтаксически правильно написанный код на каком-то языке. В нем присутствует условный оператор if с 2 операндами (для простоты я скажу, что первый операнд это ЛОЖЬ, а второй — ИСТИНА).

Эти два операнда стоят в одном условии и соединяются логическим И.
По таблице истинности И известно что если хотя-бы один операнд ЛОЖЬ, то и при проверке на истинность, тоже ЛОЖЬ.

И вот вопрос: если при выполнении кода первый операнд будет ЛОЖЬ, а следом логическое И, то будет ли проверяться второй операнд?

И второй вопрос, (обратный первому): если первый операнд ИСТИНА, а следом логическое ИЛИ, то будет ли проверяться второй операнд?


Ответы (3 шт):

Автор решения: puffleeck

2 fixed

let x = [1, 1, 1, 1, 1, 1];
<p onclick='if(++x[0] > x[1] || ++x[1] > x[0]){alert("x0=" + x[0] + "; x1=" + x[1])}'>1 в принципе ожидаемо</p>
<p onclick='if(++x[2] > x[3] && ++x[3] == x[2]){alert("x2=" + x[2] + "; x3=" + x[3])}'>2 тож норм</p>
<p onclick='if(++x[4] > x[5] xor --x[5] < x[4]){alert("x4=" + x[4] + "; x5=" + x[5])}'>!3</p>

→ Ссылка
Автор решения: CrazyElf

В большинстве языков программирования есть договорённость, что для логических операторов используется "оптимизированный" вариант проверки: если при проверке одного из условий уже точно известно, какой будет результат, то остальные проверки не исполняются. Пример на питоне:

if print('первое') and print('второе'):
    print('выполнилось')

if print('первое') is None or print('второе'):
    print('выполнилось')

Вывод:

первое
первое
выполнилось
  • после получения False интерпретатор понял, что and уже никак "не взлетит" и посчитал всё выражение равным False, вторая проверка не стала выполняться
  • после получения True выражение с or стало истинным в любом случае и if сработал

Но следует помнить, что такое поведение прописано только для, повторюсь, логических операторов. А вот для битовых операторов уже не так, для них выполняется всё выражение, даже если результат уже должен быть понятен, такая договорённость.

if int(print('первое') is not None) & int(print('второе') is None):
    print('выполнилось')

if int(print('первое') is None) | int(print('второе') is not None):
    print('выполнилось')

Вывод:

первое
второе
первое
второе
выполнилось

В данном случае то, что мы считаем значения 0 & x и 1 | x, которые в итоге будучи в конце приведёнными к bool и проверенными в if уже заранее понятно к какому результату приведут, не мешает компилятору вычислять правые части этих выражений. Такова договорённость.

P.S. Не могу однозначно сказать, как будет вести себя в подобных ситуациях, например, C++ с теми или иными флагами компиляции, возможно там поведение будет отличаться. Но общепринятая конвенция для языков программирования вот такая.

→ Ссылка
Автор решения: Upiter 1401

За другие языки не знаю, но в джаве для этого есть отдельные операторы:

выражение поведение
a || b а или b истинно, b оценивается условно
a | b а или b истинно, b оценивается в любом случае
→ Ссылка