Spec-Zone.ru › Octave 8

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

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

© 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/v8.1.0/Short_002dcircuit-Boolean-Operators.html

Spec-Zone.ru

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