前へ | 次へ | 目次 | 索引 |
表 14-2 は,数値比較のタイプの一覧です。
比較 | 演算子 | 説明 |
---|---|---|
等しい | .EQ. | 数値と数値を比較して,等しいかどうかを判定する。 |
より大きい,または等しい | .GE. | 数値と数値を比較して,最初の数値が 2 番目の数値より大きいか,または等しいかどうかを判定する。 |
より大きい | .GT. | 数値と数値を比較して,最初の数値が 2 番目の数値より大きいかどうかを判定する。 |
より小さい,または等しい | .LE. | 数値と数値を比較して,最初の数値が 2 番目の数値より小さいか,または等しいかを判定する。 |
より小さい | .LT. | 数値と数値を比較して,最初の数値が 2 番目の数値より小さいかどうかを判定する。 |
等しくない | .NE. | 数値と数値を比較して,等しくないかどうかを判定する。 |
ここに示す例では,BALANCE シンボルが -15237 の値を持つと想定しています。
$ TEST_BALANCE = BALANCE .EQ. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 1 ... |
$ TEST_BALANCE = BALANCE .GE. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 1 ... |
$ TEST_BALANCE = BALANCE .GT. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 0 ... |
$ TEST_BALANCE = BALANCE .LE. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 1 ... |
$ TEST_BALANCE = BALANCE .LT. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 0 ... |
$ TEST_BALANCE = BALANCE .NE. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 0 ... |
特殊な形式の割り当て文を使用すれば,現在のシンボル値のバイナリ・(ビット・レベル) オーバレイを実行できます。
ローカル・シンボルの場合は,
シンボル名[ビット位置,サイズ] = 置換式 |
グローバル・シンボルの場合は,
シンボル名[ビット位置,サイズ] == 置換式 |
各要素は次のとおりです。
ビット位置 | オーバレイを実行するビット 0 からの相対位置を示す整数である。 |
サイズ | オーバレイするビット数を示す整数である。 |
数値オーバレイを使用するには,次の規則に従います。
次の例は,BELL シンボルを 7 の値に定義しています。 BELL の下位バイトは 00000111 というバイナリ値です。ここで,このバイナリ値のオフセット 5 の位置の 0 を 1 に変更すれば (ビットは,右から左に 0 から順にカウントされます), 00100111 (10 進数 39) というバイナリ値が得られます。
$ BELL = 7 $ BELL[5,1] = 1 $ SHOW SYMBOL BELL BELL = 39 Hex = 00000027 Octal = 00000000047 |
これ以降の節では,論理値と式の使用について説明します。
14.8.1 論理演算
一部の演算では,数値と文字列を次のような値を持つ論理データとして解釈します。
次の例では,DOG_COUNT に 13 という値が割り当てられています。 IF STATUS は,論理値 STATUS が真であることを意味します。
$ STATUS = 1 $ IF STATUS THEN DOG_COUNT = 13 |
$ STATUS = "TRUE" $ IF STATUS THEN DOG_COUNT = 13 |
論理演算は,演算の対象となる数値のすべてのビットに影響します。 論理式 の値は整数であり,式の結果も整数になります。論理式で文字列値を指定すると,文字列が整数に変換されてから,式の評価が行われます。
通常は,論理式を使用して,論理値の下位ビットを評価します。すなわち,値が真か偽かを判断します。次の論理演算を指定できます。
.NOT. 演算子は,論理値のビット構成を反転します。真の値は偽となり,偽の値は真となります。
.AND. 演算子は,次に示すように,2 つの論理値の論理積を求めます。
ビット・レベル | 要素レベル |
---|---|
1 .AND. 1 = 1 | 真 .AND. 真 = 真 |
1 .AND. 0 = 0 | 真 .AND. 偽 = 偽 |
0 .AND. 1 = 0 | 偽 .AND. 真 = 偽 |
0 .AND. 0 = 0 | 偽 .AND. 偽 = 偽 |
.OR. 演算子は,次に示すように,2 つの論理値の論理和を求めます。
ビット・レベル | 要素レベル |
---|---|
1 .OR. 1 = 1 | 真 .OR. 真 = 真 |
1 .OR. 0 = 1 | 真 .OR. 偽 = 真 |
0 .OR. 1 = 1 | 偽 .OR. 真 = 真 |
0 .OR. 0 = 0 | 偽 .OR. 偽 = 偽 |
次の例は,真の値を偽に反転させます。式の評価は -2 で,この値は偶数であるため,結果は偽となります。
$ SHOW SYMBOL STATUS STATUS = 1 Hex = 00000001 Octal = 00000000001 $ STATUS = .NOT. STATUS $ SHOW SYMBOL STATUS STATUS = -2 Hex = FFFFFFFE Octal = 37777777776 |
次の例では,真の値と偽の値の論理積を求めた結果が偽の値になっています。
$ STAT1 = "TRUE" $ STAT2 = "FALSE" $ STATUS = STAT1 .AND. STAT2 $ SHOW SYMBOL STATUS STATUS = 0 Hex = 00000000 Octal = 00000000000 |
次の例は,真の値と偽の値の論理和を求めることによって,結果は真の値になっています。
$ STAT1 = "TRUE" $ STAT2 = "FALSE" $ STATUS = STAT1 .OR. STAT2 $ SHOW SYMBOL STATUS STATUS = 1 Hex = 00000001 Octal = 00000000001 |
次の表は,ビット単位と数値単位の論理演算の結果を示しています。論理演算では,大文字または小文字の T または Y で始まる文字列は数値 1 として処理され,これ以外の文字で始まる文字列は,数値 0 として処理されます。また,奇数は真になり,偶数とゼロは偽になります。
指定された: | 結果: | ||||
---|---|---|---|---|---|
ビット A | ビット B | .NOT. A | A .AND. B | A .OR. B | |
1 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 0 | 1 | |
0 | 1 | 1 | 0 | 1 | |
0 | 0 | 1 | 0 | 0 |
指定された: | 結果: | ||||
---|---|---|---|---|---|
数値 A | 数値 B | .NOT. A | A .AND. B | A .OR. B | |
奇数 | 奇数 | 偶数 | 奇数 | 奇数 | |
奇数 | 偶数 | 偶数 | 偶数 | 奇数 | |
偶数 | 奇数 | 奇数 | 偶数 | 奇数 | |
偶数 | 偶数 | 奇数 | 偶数 | 偶数 |
レキシカル関数は,通常コマンド・プロシージャの中で使用され,システム・プロセス,バッチ・キューと印刷キュー,ユーザ・プロセスなどについての情報をシステムから検索します。レキシカル関数を使用して,文字列を処理したり論理名を変換することもできます。レキシカル関数をシンボルに割り当てた場合,実際にはレキシカル関数によって戻される情報 (たとえば,数値や文字列) がシンボルに割り当てられます。このとき,DCL レベルでは,DCL の SHOW SYMBOL コマンドでその情報を表示できます。コマンド・プロシージャの中では,シンボルに格納された情報を後でプロシージャで使用できます。それぞれのレキシカル関数については,『Compaq OpenVMS DCL ディクショナリ』を参照してください。
レキシカル関数を使用するには,レキシカル関数の名前 (先頭に F$ が付く) とその引数リストを指定します。次の形式を使用します。
F$関数名(引数[,...]) |
引数リストは関数名の後に指定し,その間にスペースやタブをいくつでもいれることができます。
レキシカル関数を使用する場合は,次の規則に従います。
レキシカル関数は,文字列,整数,シンボルと同じように使用します。式の中でレキシカル関数を使用すると,DCL は自動的に関数を評価して,関数を戻り値と置き換えます。
次の例では,F$LENGTH 関数は,引数 BUMBLEBEEとして指定された値の長さを戻します。 DCL は,自動的に戻り値 (9) を判別し,この値を使用して式を評価します。したがって,式 (9 + 1) の結果は 10 となり,この値が SUM シンボルに割り当てられます。
$ SUM = F$LENGTH("BUMBLEBEE") + 1 $ SHOW SYMBOL SUM SUM = 10 Hex = 0000000A Octal = 00000000012 |
各レキシカル関数は,情報を整数または文字列のいずれかとして戻すことに注意してください。また,レキシカル関数の引数は,整数または文字列式として指定しなければなりません。
たとえば,F$LENGTH 関数は,文字列式である引数を必要とし,整数の値を戻します。前の例で,"BUMBLEBEE" 引数は文字列式であり,戻り値 (9) は整数です。
レキシカル関数は,シンボルを使用できる場所であればどこでも使用できます。シンボルを一重引用符で囲んで( 第 14.12 節 を参照),シンボル置換を強制しなければならない場所では,レキシカル関数の前後に一重引用符を置いて,レキシカル関数の評価を強制しなければなりません。レキシカル関数は,他のレキシカル関数の引数値としても使用できます。
F$LENGTH 関数に対して引数を指定する,他の方法を以下の例に示します。それぞれの例では,引数は文字列式です。
$ BUG = "BUMBLEBEE" $ LEN = F$LENGTH(BUG) $ SHOW SYMBOL LEN LEN = 9 Hex = 00000009 Octal = 00000000011 |
BUG シンボルを引数として使用する場合,前後に引用符は付けません。レキシカル関数は"BUMBLEBEE" 値を自動的に BUG に置換して,長さを判別し,9 の値を戻します。
$ BUG = "BUMBLEBEE" $ LEN = F$LENGTH(BUG) $ SHOW SYMBOL LEN LEN = 9 Hex = 00000009 Octal = 00000000011 $ LEN = F$LENGTH(BUG + "S") $ SHOW SYMBOL LEN LEN = 10 Hex = 0000000A Octal = 00000000012 |
BUG シンボルは引用符で囲まれていませんが,文字列の "S" は引用符で囲まれています。引数を評価してからでないと,F$LENGTH 関数は長さを判別できません。 BUG シンボル ("BUMBLEBEE") によって表現される値は "S" 文字列と連結され,結果は "BUMBLEBEES" になっています。 F$LENGTH 関数は,"BUMBLEBEES" 文字列の長さを判別して, 10 の値を戻します。
$ LEN = F$LENGTH(F$DIRECTORY()) $ SHOW SYMBOL LEN LEN = 8 Hex = 00000008 Octal = 00000000010 |
F$DIRECTORY を引数として使用する場合は,前後に引用符を付けません。関数は自動的に評価されます。 F$DIRECTORY 関数の結果が戻ってからでないと, F$LENGTH 関数は長さを判別できません。結果が戻ると,F$LENGTH 関数は省略時のディレクトリの長さ (大括弧を含む) を判別します。
14.8.5 演算の順序
式には演算と比較操作をいくつでも指定できます。次の表は,式の中に 2 つ以上の演算子がある場合の演算子を評価順にリストしたものです。演算子は,優先順位の高い順にリストされています。すなわち,上にある演算子ほど先に実行されます。
優先順位 | 演算 |
---|---|
7 | 単項プラス (+) と単項マイナス(--) |
6 | 乗算 (*) と除算 (/) |
5 | 加算 (連結) と減算 (削減) |
4 | すべての数値および文字比較 |
3 | 論理 NOT 演算 |
2 | 論理 AND 演算 |
1 | 論理 OR 演算 |
1 つの式の中に同じ優先順位を持つ複数の演算子がある場合には,左から右に演算が行われます。通常の優先順位 (演算と比較を評価する順) を変更するには,最初に実行しようとする演算を括弧で囲みます。括弧をネストすることもできます。
次の例では,括弧があるために,乗算の前に加算が実行されます。括弧がなければ,乗算を先に実行するため,結果は 26 になります。括弧はネスト可能です。
$ RESULT = 4 * (6 + 2) $ SHOW SYMBOL RESULT RESULT = 32 Hex = 00000020 Octal = 00000000040 |
前へ | 次へ | 目次 | 索引 |