8.5.2 Short-circuit Boolean Operators

Last-modified: 2025-03-22 (土) 21:04:49

8.5.2 短絡ブール演算子

ifおよび 条件でのスカラー値への暗黙的な変換と組み合わせるとwhile、Octave の要素ごとのブール演算子は、ほとんどの論理演算を実行するのに十分であることがよくあります。ただし、全体の真理値が決定したらすぐにブール式の評価を停止することが望ましい場合があります。Octave の 短絡ブール演算子はこのように動作します。

boolean1 && boolean2

式boolean1 は、演算 と同等の方法で評価され、スカラーに変換されます。 boolean1 が論理値でない場合は、その値がゼロ以外の場合は true とみなされ、その値がゼロの場合は false とみなされます。boolean1が配列の場合は、空でなく、すべての要素がゼロ以外の場合にのみ true とみなされます。boolean1 がfalse と評価された場合、式全体の結果は false になります。 true の場合は、式boolean2がboolean1と同じように評価されます。 true の場合は、式全体の結果は true になります。それ以外の場合は、式全体の結果は false になります。 all (boolean1(:))
警告:の評価との等価性の唯一の例外は、 が空の配列である場合です。MATLAB互換性のため、空の配列の真理値は常に なので、 が であっても は に評価されます。 all (boolean1(:))boolean1false[] && truefalseall ([])true

boolean1 || boolean2

式boolean1 は、演算 と同等の方法で評価され、スカラーに変換されます。 boolean1 が論理値でない場合は、その値がゼロ以外の場合は true とみなされ、その値がゼロの場合は false とみなされます。boolean1が配列の場合は、空でなく、すべての要素がゼロ以外の場合にのみ true とみなされます。boolean1 がtrue と評価された場合、式全体の結果は true になります。 false の場合は、式boolean2がboolean1と同じように評価されます。 true の場合は、式全体の結果は true になります。それ以外の場合は、式全体の結果は false になります。 all (boolean1(:))
警告:空行列の真理値は常に です false。詳細については、前のリスト項目を参照してください。
式全体の真理値を決定する前に両方のオペランドが評価されない可能性があるという事実は重要です。たとえば、式

a && b++

変数bの値は、変数 aがゼロ以外の場合にのみ増加します。
これを使うと、もう少し簡潔なコードを書くことができます。例えば、次のように書くことができます。

function f (a, b, c)
if (nargin > 2 && ischar (c))
  ...

if存在しない引数を評価しようとしないように 2つの文を使う代わりに、例えば、ショートサーキット機能がなければ、次のように書く必要があるでしょう。

function f (a, b, c)
if (nargin > 2)
  if (ischar (c))
    ...

書き込み

function f (a, b, c)
if (nargin > 2 & ischar (c))
  ...

f1つまたは2つの引数で呼び出された場合、Octaveは演算子 ' の両方のオペランドを評価しようとするため、エラーが発生します。&'。
MATLABには、演算子「&' そして '|if ' は、およびステートメントの真理値式で使用すると短絡しますwhile。Octave は互換性のために同じように動作しますが、' の使用は&' そして '|' 演算子をこのように使用することは強く推奨されず、警告が発行されます。代わりに、'&&' そして '||' 演算子は常に短絡動作をします。
最後に、三項演算子 (?:) は Octave ではサポートされていません。短絡が重要でない場合は、ifelse 関数に置き換えることができます。

: M = merge (mask, tval, fval)

: M = ifelse (mask, tval, fval)

maskの値に応じて、true_valとfalse_valの要素をマージします。

maskが論理スカラーの場合、他の 2 つの引数は任意の値にすることができます。それ以外の場合、 mask は論理配列である必要があり、tval、 fval は一致するクラスの配列、またはセル配列である必要があります。スカラー マスクの場合、maskが true の 場合はtvalが返され、それ以外の場合はfvalが返されます。
配列マスクの場合、tvalとfval は両方ともスカラーか、 maskと同じ次元の配列である必要があります。結果は次のように構築されます。

result(mask) = tval(mask);
result(! mask) = fval(! mask);

マスクは任意の数値型にすることもできます。その場合は、まず論理型に変換されます。
プログラミング ノート:ifelseは の別名でありmerge、互換的に使用できます。
See also: logical, diff.