Spec-Zone.ru › Octave 7

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 должны быть массивами соответствующего класса или массивами ячеек. В случае логического скалярного mask возвращается tval, если mask истинно, в противном случае возвращается fval.

В случае логического массива mask оба 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/v7.2.0/Short_002dcircuit-Boolean-Operators.html

Spec-Zone.ru

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