8.5.2 Короткое замыкание булевых операторов ¶
В сочетании с неявным преобразованием в скалярные значения в условиях if и while, элементные булевы операторы Octave часто достаточны для выполнения большинства логических операций. Однако иногда желательно прекратить вычисление булева выражения, как только можно определить его истинность. Булевы операторы Octave с короткое замыкание работают таким образом.
-
boolean1 && boolean2¶ -
Выражение boolean1 оценивается и преобразуется в скаляр с использованием операции, эквивалентной
all (boolean1(:)). Если boolean1 не является логическим значением, оно считается истинным, если его значение отлично от нуля, и ложным, если оно равно нулю. Если boolean1 является массивом, он считается истинным только в том случае, если он не пустой и все элементы отличны от нуля. Если boolean1 оценивается как ложь, результат всего выражения — ложь. Если оно истинно, выражение boolean2 оценивается так же, как и boolean1. Если оно истинно, результат всего выражения — истина. В противном случае результат всего выражения — ложь.Предупреждение: единственное исключение из эквивалентности с вычислением
all (boolean1(:))возникает, когдаboolean1пустой массив. Для совместимости с MATLAB, значение пустого массива всегдаfalse, поэтому[] && trueоценивается какfalse, хотяall ([])являетсяtrue. -
boolean1 || boolean2¶ -
Выражение boolean1 оценивается и преобразуется в скаляр с использованием операции, эквивалентной
all (boolean1(:)). Если boolean1 не является логическим значением, оно считается истинным, если его значение отлично от нуля, и ложным, если оно равно нулю. Если boolean1 является массивом, он считается истинным только в том случае, если он не пустой и все элементы отличны от нуля. Если boolean1 оценивается как истина, результат всего выражения — истина. Если оно ложно, выражение boolean2 оценивается так же, как и boolean1. Если оно истинно, результат всего выражения — истина. В противном случае результат всего выражения — ложь.Предупреждение: значение пустой матрицы всегда
false, см. предыдущий пункт для деталей.
Тот факт, что оба операнда могут не быть оценены до определения истинности всего выражения, может быть важным. Например, в выражении
a && b++
значение переменной b увеличивается только в том случае, если переменная a отлична от нуля.
Это позволяет писать немного более лаконичный код. Например, можно написать
function f (a, b, c)
if (nargin > 2 && ischar (c))
... вместо того, чтобы использовать два if оператора, чтобы избежать попытки оценить аргумент, которого не существует. Например, без функции короткого замыкания необходимо написать
function f (a, b, c)
if (nargin > 2)
if (ischar (c))
... Запись
function f (a, b, c)
if (nargin > 2 & ischar (c))
... приведет к ошибке, если f был вызван с одним или двумя аргументами, потому что Octave будет вынужден оценить оба операнда для оператора ‘&’.
У MATLAB есть специальное поведение, которое позволяет операторам ‘&’ и ‘|’ выполнять короткое замыкание, когда они используются в булевом выражении для if и while операторов. Octave ведет себя так же для обеспечения совместимости, однако использование операторов ‘&’ и ‘|’ таким образом настоятельно не рекомендуется, и будет выведено предупреждение. Вместо этого вы должны использовать операторы ‘&&’ и ‘||’, которые всегда выполняют короткое замыкание.
Наконец, тернарный оператор (?:) не поддерживается в Octave. Если короткое замыкание не важно, его можно заменить функцией ifelse.
-
:
M =merge(mask, tval, fval)¶ -
:
M =ifelse(mask, tval, fval)¶ -
Объединение элементов true_val и false_val в зависимости от значения mask.
Если mask является логическим скаляром, остальные два аргумента могут быть произвольными значениями. В противном случае mask должен быть логическим массивом, а tval, fval должны быть массивами соответствующего класса или массивами ячеек. В случае скалярного маскирования tval возвращается, если mask истинен, в противном случае возвращается fval.
В случае массива маскирования, как tval, так и fval должны быть скалярами или массивами с размерами, равными mask. Результат формируется следующим образом:
result(mask) = tval(mask); result(! mask) = fval(! mask);
mask также может быть произвольным числовым типом, в этом случае он сначала преобразуется в логический.
Примечание по программированию:
ifelseявляется псевдонимом дляmergeи может использоваться взаимозаменяемо.
© 1996–2023 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.2.0/Short_002dcircuit-Boolean-Operators.html