Spec-Zone.ru › Octave 6

8.5.2 Короткое замыкание логических операторов

В сочетании с неявным преобразованием в скалярные значения в if и while условиях логические операторы Octave, действующие поэлементно, часто достаточны для выполнения большинства логических операций. Однако иногда желательно прекратить вычисление логического выражения, как только можно определить его истинное значение. Операторы логического короткого замыкания Octave работают таким образом.

boolean1 && boolean2

Выражение boolean1 вычисляется и преобразуется в скаляр с использованием эквивалента операции all (boolean1(:)). Если оно ложно, результат всего выражения равен 0. Если оно истинно, выражение boolean2 вычисляется и преобразуется в скаляр с использованием эквивалента операции all (boolean2(:)). Если оно истинно, результат всего выражения равен 1. В противном случае результат всего выражения равен 0.

Предупреждение: существует одно исключение из правила вычисления all (boolean1(:)), когда boolean1 является пустой матрицей. Логическое значение пустой матрицы всегда false, поэтому [] && true вычисляется как false, даже если all ([]) имеет значение true.

boolean1 || boolean2

Выражение boolean1 вычисляется и преобразуется в скаляр с использованием эквивалента операции all (boolean1(:)). Если оно истинно, результат всего выражения равен 1. Если оно ложно, выражение boolean2 вычисляется и преобразуется в скаляр с использованием эквивалента операции all (boolean2(:)). Если оно истинно, результат всего выражения равен 1. В противном случае результат всего выражения равен 0.

Предупреждение: логическое значение пустой матрицы всегда 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.

: merge (mask, tval, fval)
: 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 также может быть произвольным числовым типом, в этом случае он сначала преобразуется в логический.

См. также: logical, diff.

© 1996–2022 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/v6.4.0/Short_002dcircuit-Boolean-Operators.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API