Почему!(0 || 1 || 0) равно 0?
Я пытаюсь понять булеву логику и операторы. Я нашел этот пример, но не могу понять, почему это выражение будет соответствовать приведенному ниже.
Скажем, а = 0, б = 1, с = 0
Expression Will Evaluate to
val1 = !(a || b || c); !(0 || 1 || 0) = !(1) = 0
На мой взгляд, val1 не a
или нет b
или нет c
так почему он оценивает не 1?
4 ответа
Not(a или b или c) сначала оценивает операции или, поэтому это не то же самое, что (не a), (не b) или (не c).
Действительно, это то же самое, что (не а) И (не б) И (не в).
Любой операнд ИЛИ, являющийся истинным, даст истинный результат, а затем НЕ переворачивает это на ложный результат для выражения в целом.
Как и в случае арифметики целых или действительных чисел, порядок операций может значительно изменить результат.
.... val1 не является или не b или не с...
Нет, это неверно. 0 || 1 || 0
внутри скобки оценивается первым. Пример имеет это право.
Пойдем пошагово.
val1 = !(0 || 1 || 0);
Во-первых, 0 || 1
будет оценивать до 1, потому что ||
означает "истина, если хотя бы один из них является истиной, в противном случае - ложь", и 1 = истина, 0 = ложь.
Так что теперь этоval1 = !(1 || 0);
Вот 1 || 0
будет снова оценивать до 1, потому что по крайней мере один из них равен 1. Теперь у нас есть val1 = !(1);
, !
означает противоположность ввода, так !(1)
= 0
На мой взгляд, val1 не a или не b или не c, так почему он оценивает не 1?
Потому что то, что вы говорите, будет написано как val1 = !0 || !1 || !0
, Это совсем другое, потому что у него нет круглых скобок. Круглая скобка означает "сначала оцените все в скобках".
Скажем val1 = 1
1 = !(0 || 1 || 0)
1 = !(1)
- потому что это единственное значение, равное val11 = 0
- тогда это отрицает это потом