&&
, _lazy_and
“сорвите и” Булевых выражений
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
b1 && b2 && …
_lazy_and(b1, b2, …
)
b1 && b2 && ...
выполняет Булево выражение b1 and b2 and ...
“оценкой короткого замыкания”.
b1 && b2 && ...
приводит к тому же результату как bool(b1 and b2 and ...)
, если последний вызов не выдает ошибку. Различие между этими вызовами следующие. Вызов bool(b1 and b2 and ...)
выполняет все Булевы выражения прежде, чем объединить их логически через and
.
_lazy_and(b1, b2, ...)
равен b1 && b2 && ...
.
Обратите внимание на то, что результатом является FALSE
, если один из b1
, b2
, и так далее оценивает к FALSE
. “сорвите оценку”, основан на этом факте: b1 && b2 && ...
оценивает аргументы слева направо. Оценка сразу останавливается, если один аргумент оценивает к FALSE
. В этом случае _lazy_and
возвращает FALSE
, не выполняя остающиеся Булевы выражения. Если ни одно из выражений, которые b1
, b2
, и так далее выполняет к FALSE
, то все аргументы оценены и соответствующий результат (TRUE
или UNKNOWN
) не возвращено.
_lazy_and
также называется “условным and
”.
Если любое из продуманных Булевых выражений, b1
, b2
, и так далее не может быть оценен к TRUE
, FALSE
или UNKNOWN
, то _lazy_and
выдает ошибку.
_lazy_and
используется внутренне if
, repeat
и операторами while
. Например, оператор if b1 and b2 then ...
эквивалентен if b1 && b2 then ...
.
_lazy_and()
возвращает TRUE
.
Этот пример показывает различие между коротким замыканием и полной оценкой булевых условий. Для x = 0, оценка приводит к ошибке:
x := 0: bool(x <> 0 and sin(1/x) = 0)
Error: Division by zero. [_invert]
С “оценкой короткого замыкания”, не выполнено выражение. Это избегает предыдущей ошибки:
x <> 0 && sin(1/x) = 0
delete x
Следующие операторы не делают никакого вывода к ошибке, потому что использование if
срывает оценку внутренне:
for x in [0, PI, 1/PI] do if x <> 0 and sin(1/x) = 0 then print(x) end_if; end_for:
delete x
_lazy_and
может быть назван без параметров:
_lazy_and()
|
Булевы выражения |
TRUE
, FALSE
или UNKNOWN
.
b1
, b2