[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5 ブール演算子


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.1 要素ごとのブール演算子

要素ごとの論理(ブール)式は,ブール演算子"or"(`|'), "and"(`&')および"not"(`!')と,入れ子をコントロールする ための括弧を用いた比較式の組み合わせです。ブール式の真理値は,成分式の対 応する要素の真理値の組み合わせによって計算されます。ある値がゼロならば偽 であり,それ以外は真であると見なします。

ようそごとのブール式は,使用できる比較式であれば,何でも使えます。これら は,ifおよびwhileステートメントにおいても利用できます。しか し,もしifまたはwhileステートメントにおいて条件として行列を 使用するならば,その要素のすべてがゼロでないときに限り真になりま す。

比較演算子のように,要素どうしのブール式の各々の要素は数値を持ちます(真な らば1,偽ならば0)。これは,ブール式の結果が変数に格納されたときには, 数値になり,ふつうの値として使用されます。

要素どうしのブール演算子についての解説です。

boolean1 & boolean2

もしboolean1boolean2の対応する要素の両方が真ならば,結果の 要素は真となります。

boolean1 | boolean2

もしboolean1boolean2の対応する要素のどちらかが真ならば,結 果の要素は真となります。

! boolean
~ boolean

もしbooleanの要素が偽ならば,結果の要素は真となります。

オペランドに行列を指定したとき,これらの演算子は要素ごとに働きます。 たとえば,

 
[1, 0; 0, 1] & [1, 0; 2, 3]

この式は,2行2列の単位行列を返します。

二項演算子に対して,両方のオペランドが行列ならば,オペランドの次元はそろっ ていなければなりません。もしオペランドの片方がスカラであり,もう片方が行列 ならば,この演算子は行列の各要素にスカラを適用します。

要素ごとの二項ブール演算子について,式boolean1boolean2の両方 とも,結果を計算する前に評価されます。このことは,その式が別の効果をもつと きに異なる結果を生むことになります。たとえば,

 
a & b++

この式は,たとえ変数aがゼロであっても,bはインクリメントされま す。

この挙動は,ブール演算子が,行列のオペランドで説明したように動作するために 必要なことです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.2 短絡回路ブール演算子

ifおよびwhileの条件において,スカラへの暗黙的な変換と結合し て,Octaveの要素ごとのブール演算子は,しばしば大部分の論理演算子を実行する には十分です。しかし,全体の真理値を決定することができた時点で,ただちに ブール式の評価をやめることが望ましいことがあります。Octaveの短絡回路 ブール演算子は,そのように動作します。

boolean1 && boolean2

all(all (boolean1))と等価な操作を利用して,式boolean1 は評価され,スカラに変換されます。もしそれが偽ならば,式全体は0という 結果になります。もしそれが真ならば,all (all (boolean2))と 等価な操作を利用して,式boolean2は評価され,スカラに変換されます。 もしこれが真ならば,式全体の結果は1であり,そうでなければ全体の式の結 果は0になります。

boolean1 || boolean2

all (all (boolean1))と等価な操作を利用して,式boolean1 は評価され,スカラに変換されます。もしそれが真ならば,式全体は1という 結果になります。もしそれが偽ならば,all (all (boolean2))と 等価な操作を利用して,式boolean2は評価され,スカラに変換されます。 もしこれが真ならば,全体の式の結果は1であり,そうでなければ式全体の結果 は0になります。

両方のオペランドが,式の全体の真理値を決定する前に評価されないことがある という事実は,重要に成り得ます。たとえば,

 
a && b++

この式は,変数bの値は,変数aがゼロでないときにだけインクリメ ントされます。

これは,いくぶん簡潔なコードを書くのに使えるでしょう。たとえば,

 
function f (a, b, c)
  if (nargin > 2 && isstr (c))
    …

このコードは,存在しない引数を評価しようとするのを避けるために,2つの ifステートメントを使わねばならないところに使うことができます。 たとえば,短絡回路機能を使わないとすれば,以下のように書く必要がありま す。

 
function f (a, b, c)
  if (nargin > 2)
    if (isstr (c))
      …

以下のコード

 
function f (a, b, c)
  if (nargin > 2 & isstr (c))
    …

は,fを1個または2個の引数をつけて呼び出すと,エラーになります。 なぜならば,Octaveは,演算子`&'に関する2つのオペランドを両方とも 評価しようとするからです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated on July, 20 2006 using texi2html 1.76.