# OpenVMS
ユーザーズ・マニュアル

前へ | 次へ | 目次 | 索引

## 14.7.4 数値の比較

表 14-2 は，数値比較のタイプの一覧です。

表 14-2 数値比較
比較 | 演算子 | 説明
--- | --- | ---
等しい | .EQ. | 数値と数値を比較して，等しいかどうかを判定する。
より大きい，または等しい | .GE. | 数値と数値を比較して，最初の数値が 2 番目の数値より大きいか，または等しいかどうかを判定する。
より大きい | .GT. | 数値と数値を比較して，最初の数値が 2 番目の数値より大きいかどうかを判定する。
より小さい，または等しい | .LE. | 数値と数値を比較して，最初の数値が 2 番目の数値より小さいか，または等しいかを判定する。
より小さい | .LT. | 数値と数値を比較して，最初の数値が 2 番目の数値より小さいかどうかを判定する。
等しくない | .NE. | 数値と数値を比較して，等しくないかどうかを判定する。

ここに示す例では，BALANCE シンボルが -15237 の値を持つと想定しています。

- 次の例では，BALANCE は -15237 に等しいため，1 (真) が戻されます。

      $ TEST_BALANCE = BALANCE .EQ. -15237
      $ SHOW SYMBOL TEST_BALANCE
        TEST_BALANCE = 1   ...

- 次の例では，BALANCE は -15237 より大きいか，または等しいため，1 (真) が戻されます。

      $ TEST_BALANCE = BALANCE .GE. -15237
      $ SHOW SYMBOL TEST_BALANCE
        TEST_BALANCE = 1   ...

- 次の例では，BALANCE は -15237 より大きくないので，0 (偽) が戻されます。

      $ TEST_BALANCE = BALANCE .GT. -15237
      $ SHOW SYMBOL TEST_BALANCE
        TEST_BALANCE = 0  ...

- 次の例では，BALANCE は -15237 より小さいか，または等しいので，1 (真) が戻されます。

      $ TEST_BALANCE = BALANCE .LE. -15237
      $ SHOW SYMBOL TEST_BALANCE
        TEST_BALANCE = 1   ...

- 次の例では，BALANCE は -15237 より小さくないので，0 (偽) が戻されます。

      $ TEST_BALANCE = BALANCE .LT. -15237
      $ SHOW SYMBOL TEST_BALANCE
        TEST_BALANCE = 0   ...

- 次の例では，BALANCE は -15237 に等しいので，0 (偽) が戻されます。

      $ TEST_BALANCE = BALANCE .NE. -15237
      $ SHOW SYMBOL TEST_BALANCE
        TEST_BALANCE = 0   ...

## 14.7.5 数値オーバレイの実行

特殊な形式の割り当て文を使用すれば，現在のシンボル値のバイナリ・(ビット・レベル) オーバレイを実行できます。

ローカル・シンボルの場合は，

    シンボル名[ビット位置,サイズ] = 置換式

グローバル・シンボルの場合は，

    シンボル名[ビット位置,サイズ] == 置換式

各要素は次のとおりです。

ビット位置 | オーバレイを実行するビット 0 からの相対位置を示す整数である。
サイズ | オーバレイするビット数を示す整数である。

数値オーバレイを使用するには，次の規則に従います。

- 大括弧 ([]) は必ず指定しなければならない。シンボル名と左大括弧の間にはスペースをいれない。

- リテラル値は 10 進数とみなされる。

- サイズの最大長は 32 ビット。

- 置換式は数値式でなければならない。

- シンボル名が未定義であるか，文字列として定義されている場合には，オーバレイの結果は文字列になる。それ以外の場合には，オーバレイの結果は整数になる。

次の例は，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 論理値と式の使用

これ以降の節では，論理値と式の使用について説明します。

## 14.8.1 論理演算

一部の演算では，数値と文字列を次のような値を持つ論理データとして解釈します。

- 真
  数値が奇数の場合(すなわち，下位バイトが 1 の場合) には，その数値の論理値は真となります。文字列の場合は，最初の文字が大文字または小文字の T または Y のときに，その文字列の論理値は真となります。

- 偽
  数値が偶数の場合 (すなわち，下位バイトが 0 の場合) には，その数値の論理値は偽となります。文字列の場合は，最初の文字が大文字または小文字の T または Y でないときに，その文字列の論理値は偽となります。

次の例では，DOG_COUNT に 13 という値が割り当てられています。 IF STATUS は，論理値 STATUS が真であることを意味します。

    $ STATUS = 1
    $ IF STATUS THEN DOG_COUNT = 13

    $ STATUS = "TRUE"
    $ IF STATUS THEN DOG_COUNT = 13

## 14.8.2 論理式

論理演算は，演算の対象となる数値のすべてのビットに影響します。 論理式 の値は整数であり，式の結果も整数になります。論理式で文字列値を指定すると，文字列が整数に変換されてから，式の評価が行われます。

通常は，論理式を使用して，論理値の下位ビットを評価します。すなわち，値が真か偽かを判断します。次の論理演算を指定できます。

- 論理否定 (.NOT.)

  .NOT. 演算子は，論理値のビット構成を反転します。真の値は偽となり，偽の値は真となります。

- 論理積 (.AND.)

  .AND. 演算子は，次に示すように，2 つの論理値の論理積を求めます。

  ビット・レベル | 要素レベル
  --- | ---
  1 .AND. 1 = 1 | 真 .AND. 真 = 真
  1 .AND. 0 = 0 | 真 .AND. 偽 = 偽
  0 .AND. 1 = 0 | 偽 .AND. 真 = 偽
  0 .AND. 0 = 0 | 偽 .AND. 偽 = 偽

- 論理和 (.OR.)

  .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

## 14.8.3 論理演算の結果

次の表は，ビット単位と数値単位の論理演算の結果を示しています。論理演算では，大文字または小文字の 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
奇数 | 奇数 |  | 偶数 | 奇数 | 奇数
奇数 | 偶数 |  | 偶数 | 偶数 | 奇数
偶数 | 奇数 |  | 奇数 | 偶数 | 奇数
偶数 | 偶数 |  | 奇数 | 偶数 | 偶数

## 14.8.4 レキシカル関数が戻す値の使用

レキシカル関数は，通常コマンド・プロシージャの中で使用され，システム・プロセス，バッチ・キューと印刷キュー，ユーザ・プロセスなどについての情報をシステムから検索します。レキシカル関数を使用して，文字列を処理したり論理名を変換することもできます。レキシカル関数をシンボルに割り当てた場合，実際にはレキシカル関数によって戻される情報 (たとえば，数値や文字列) がシンボルに割り当てられます。このとき，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 の値を戻します。

- 次の例は，F$DIRECTORY 関数の引数として別のレキシカル関数を使用しています。 F$DIRECTORY 関数は，大括弧を含む，現在の省略時のディレクトリの名前を戻します。この例では，現在の省略時のディレクトリは [SALMON] です。

      $ 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

前へ | 次へ | 目次 | 索引