Tcl – 関係式と論理式の評価について

Tclでは関係式と論理式の評価(判定)にexprコマンドを使います。関係式は、左辺と右辺の値が関係演算子(<, >, = など)で示す関係であることを表す式のことです。論理式は、関係式を論理演算子(AND, OR, NOTなど)で結び合わせた式になります。

exprコマンドは、関係式が成立する場合、「1」真(true)を返します。成立しない場合は、「0」偽(false)を返します。また、論理式は、論理演算をした結果を「1」真(true)または「0」偽(false)で返します。

関係演算子(比較演算子)

関係演算子は演算子の左辺と右辺の値を比較して判定結果を「1(真)」または「0(偽)」という数値で返します。関係演算子の種類は以下の表で示す演算子があります。

関係演算子の種類
演算子意味
a < baはbより小さい。
a > baはbより大きい。
a == baとbは等しい。
a != baとbは等しくない。
a <= baはbと等しいか小さい。
a >= baはbと等しいか大きい。

[使用例]

% set x 5
5

% expr $x == 7   ---(1)
0
% expr $x != 7   ---(2)
1
% expr $x < 7    ---(3)
1

[説明]

(1) 変数xの値:5と数値:7が等しいことを判定します。

⇒等しくないので0(偽)を返します。

(2) 変数xの値:5と数値:7が等しくないことを判定します。

⇒等しくないので1(真)を返します。

(3) 変数xの値:5が数値:7より小さいか判定します。

⇒小さいので1(真)を返します。

論理演算子

論理演算子は左辺の式の判定結果と右辺の式の判定結果の組み合わせにより1(真)または0(偽)を返します。 論理演算子の種類は以下の表で示す演算子があります。

論理演算子の種類
演算子意味
a && baとbが共に真の場合に1(真)を返します 。(AND:論理積)
a || baまたはbが真の場合に1(真)を返します。(OR:論理和)
!aaが真でない場合に1(真)を返します。言い換えると、aが0以外の場合は0(偽)を返します。(NOT:否定)

AND:論理積の場合

論理積の組み合わせパターンは以下の表のようになります。

ANDの組み合わせパターン
右辺左辺戻り値
1
0
0
0

[使用例]

% set n1 10
10
% set n2 20
20

% expr $n1 < 20 && $n2 < 30   ---(1)
1
% expr $n1 < 20 && $n2 == 30  ---(2)
0

[説明]

(1)

  • 左辺:変数n1の値:10は数値:20より小さいので「真」。
  • 右辺:変数n2の値:20は数値:30より小さいので「真」。

⇒「真」かつ「真」の為、1(真)を返します。

(2)

  • 左辺:変数n1の値:10は数値:20より小さいので「真」。
  • 右辺:変数n2の値:20は数値:30と等しくないので「偽」。

⇒「真」かつ「偽」の為、0(偽)を返します。

OR:論理和の場合

論理和の組み合わせパターンは以下の表のようになります。

ORの組み合わせパターン
右辺左辺戻り値
1
1
1
0

[使用例]

% set n1 10
10
% set n2 20
20

% expr $n1 < 20 || $n2 < 30   ---(1)
1
% expr $n1 < 20 || $n2 == 30  ---(2)
1
% expr $n1 < 10 || $n2 > 30   ---(3)
0

[説明]

(1)

  • 左辺:変数n1の値:10は数値:20より小さいので「真」。
  • 右辺:変数n2の値:20は数値:30より小さいので「真」。

⇒「真」と「真」の為、1(真)を返します。

(2)

  • 左辺:変数n1の値:10は数値:20より小さいので「真」。
  • 右辺:変数n2の値:20は数値:30と等しくないので「偽」。

⇒「真」と「偽」の為、1(偽)を返します。

(3)

  • 左辺:変数n1の値:10は数値:10より小さくないので「偽」。
  • 右辺:変数n2の値:20は数値:30より大きくないので「偽」。

⇒「偽」と「偽」の為、0(偽)を返します。

NOT:否定の場合

否定の場合、真偽が逆転します。

[使用例]

% expr !0             ---(1)
1
% expr !1
0

% set x 5
5
% expr !($x == 10)   ---(2)
1
% expr !$x == 10
0
% expr !$x           ---(3)
0

[説明]

(1)

0の場合は1を返す。1の場合は0を返します。

(2)

($x == 10)の判定結果は0(偽)の為、1を返します。もし、!$x == 10 とすると、「!$x」が先に処理されます。

(3)

変数xの値:5は0以外の数値の為、0を返します。

三項(条件)演算子

exprコマンドは三項演算子もサポートしています。

x?y:z

三項演算子は、Xを評価した結果、0以外であれば、yの値を返します。そうでなければ、zの値を返します。

[使用例]

% set x 5
5
% expr $x > 0 ? $x + 2 : $x - 2   ---(1)
7

% set x 0
0
% expr $x > 0 ? $x + 2 : $x - 2   ---(2)
-2

[説明]

(1) 「$x + 2」の値を返します。
(2) 「$x – 2」の値を返します。

文字列を比較をする演算子

文字列を比較する場合、「==, !=」または「eq, ne」演算子を使用します。

演算子意味
a eq b文字列aとbは等しい。
a ne b文字列aとbは等しくない。

「==」、[!=]を使用した例

[使用例]

% expr {abc == abc}
invalid bareword "abc"
in expression "abc == abc";
should be "$abc" or "{abc}" or "abc(...)" or ...
% expr {"abc" == "abc"} 1 % expr {"abc" != "abc"} 0

[説明]
TclのexprコマンドはTclの規則とは異なる規則が実装されています。exprコマンドで文字列を使用する場合、文字列を「{}」または「””」で囲む必要があります。

[参考:Literal String Operands]

expr
Tclers wiki

「eq」、「ne」を使用した例

[使用例]

% expr {"5" == "5.0"}   ---(1-1)
1
% expr {"5" == "abc"}   ---(1-2)
0

% expr {"5" eq "5.0"}   ---(2-1)
0
% expr {"5" ne "5.0"}   ---(2-2)
1

[説明]
「==」演算子で文字列の比較は可能ですが、exprコマンドは与えられた引数が数値として解釈できる場合、数値として演算を試みます。「==」の一方が文字列で、もう一方が数値の場合、数値の値を文字列表現に変えて文字列比較されます。

(1-1)

文字列「5」、「5.0」ではなく数値として比較しています。

(1-2)

文字列「5」と文字列「abc」を比較しています。

(2-1)

文字列「5」、「5.0」は等しくないので0(偽)を返します。

(2-2)

文字列「5」、「5.0」は等しくないので1(真)を返します。

上の説明のように 「==」演算子は文字列に数字を使用すると意図しない結果になる可能性があります。Tclは可能な限り数値は数値として扱う傾向がある為、文字列比較が必要な場合、「==」演算子ではなく、「eq」演算子や「ne」演算子、またはstringコマンドを使用することが推奨されています。


この記事以外のexprコマンドの使い方は、必要に応じて以下の記事を参考にしてください。

Tclの数式について
Tclでは数式の評価にexprコマンドを使います。算術演算子の他に、関係演算子、論理演算子、ビット演算子、数学関数が使えます。この記事は、算術演算子の使い方と、浮動小数点数において、Tcl8.4までの挙動とTcl8.5以降の挙動の違いにつて紹介しています。

コメント

タイトルとURLをコピーしました