Spec-Zone.ru › Octave 5

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/v5.2.0/Short_002dcircuit-Boolean-Operators.html

Spec-Zone.ru

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