Вопрос про IF, AND и OR. Без привязки к языку
Вообще у меня 2 вопроса, но они очень схожи меж собой.
Допустим что у нас есть некоторый, синтаксически правильно написанный код на каком-то языке. В нем присутствует условный оператор if с 2 операндами (для простоты я скажу, что первый операнд это ЛОЖЬ, а второй — ИСТИНА).
Эти два операнда стоят в одном условии и соединяются логическим И.
По таблице истинности И известно что если хотя-бы один операнд ЛОЖЬ, то и при проверке на истинность, тоже ЛОЖЬ.
И вот вопрос: если при выполнении кода первый операнд будет ЛОЖЬ, а следом логическое И, то будет ли проверяться второй операнд?
И второй вопрос, (обратный первому): если первый операнд ИСТИНА, а следом логическое ИЛИ, то будет ли проверяться второй операнд?
Ответы (3 шт):
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>
В большинстве языков программирования есть договорённость, что для логических операторов используется "оптимизированный" вариант проверки: если при проверке одного из условий уже точно известно, какой будет результат, то остальные проверки не исполняются. Пример на питоне:
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++ с теми или иными флагами компиляции, возможно там поведение будет отличаться. Но общепринятая конвенция для языков программирования вот такая.
За другие языки не знаю, но в джаве для этого есть отдельные операторы:
| выражение | поведение |
|---|---|
a || b |
а или b истинно, b оценивается условно |
a | b |
а или b истинно, b оценивается в любом случае |