Spec-Zone.ru › Octave 9

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, и их можно использовать взаимозаменяемо.

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

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

Spec-Zone.ru

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