算術式

算術式(arithmetic expression)には、数字基本項目の一意名、数字定数、これらの一意名や定数を算術演算子でつないだもの、2つの算術式を算術演算子でつないだもの、算術式をかっこで囲んだものがある。算術式の前には単項演算子をつけることができる。

以下の記述における、

算術式の中に現れる一意名および定数は、算術演算を行える数字基本項目または数字定数のどちらかを表わしていなければならない。

算術演算子

算術式に使用できる演算子(arithmetic operator)には、5つの2項演算子(binary arithmetic operator)と、2つの単項演算子(unary arithmetic operator)がある。これらの演算子は特定の記号で表わし、前後を空白で区切る。

2項演算子
意味
+ 加算
- 減算
* 乗算
/ 除算
** べき乗

単項演算子
意味
+ 数字定数+1を掛けることと同じ
- 数字定数-1を掛けることと同じ

ビット演算子

算術式に使用できるビット演算子(bitwise operator)には、4つの2項演算子(binary bitwise operator)と、1つの単項演算子(unary bitwise operator)がある。これらの演算子は特定の予約語で表わし、前後を空白で区切る。

2項ビット演算子
意味
B-AND 2つのデータ項目のビット単位の論理 AND をとる
B-OR 2つのデータ項目のビット単位の論理 OR とる
B-XOR 2つのデータ項目のビット単位の排他的 OR とる
B-EXOR 2つのデータ項目のビット単位の排他的 OR とる
単項ビット演算子
意味
B-NOT データ項目のビット単位の論理 NOT をとる

B-XOR と B-EXOR は同義語である。

これらの演算子は、COMP-5, COMP-X のデータ項目または数字定数のみから構成される算術式の中でのみ使用することができる。 B-NOT はひとつの被演算子のみを受け付け、その他は2つの被演算子を受け付ける。 演算子の実行結果は、CBL_AND などの論理演算ライブラリルーチンを、被演算子データ項目のうち長い方のサイズをもつ一時領域に対して呼び出した結果と同等となる。 短い長さの被演算子は、事前に長い方のサイズを持つ一時領域に転記される。 被演算子のタイプが COMP-5 と COMP-X とで混在している場合、一時領域のタイプは長い方のタイプに揃えられる。このため実行時性能を考慮すればタイプの混在は避けるべきである。

以下に例題プログラムを示す:

 data division. working-storage section. 01 n1 pic 9(9). 01 n2 pic xx comp-5. 01 n3 pic xxxx comp-5. procedure division. move 2 to n2 move 4 to n3 compute n1 = n2 b-or n3 *> n1 = 6 if n2 b-and n3 = n2 display 'true' end-if compute n1 = b-not n2 *> n1 = 65533 compute n1 = n2 b-xor n3 + 1 *> n1 = 7 compute n1 = n2 b-and 2 *> n1 = 2

使用できる要素の組合せ

使用可能な変数、数字定数、算術演算子、およびかっこの組み合わせを表 10-1に示す。

表 10-1: 算術式の中で使用できる要素
最初の要素 2番目の要素
変数 * / ** + - B-AND B-OR B-XOR B-EXOR 単項 + - B-NOT ( )
変数 - P - - P
* / ** + - B-AND B-OR B-XOR B-EXOR P - P P -
単項 + - B-NOT P - - P -
( P - P P -
) - P - - P

P 許される要素の組合わせを示す
- 無効な組合わせを示す
変数 一意名または定数を示す

書き方と評価規則

算術式には、書き方と評価について、以下の規則が適用される。

  1. 算術式の中では、要素が評価される順序を指定するために、かっこを使用できる。かっこ内の式が先に評価される。入れ子になった何組かのかっこについては、最も内側の組を最初にして、順次外側の組へと評価が進む。かっこがない場合、またはかっこ内の要素が同じ水準にある場合、評価順位は下記のようになる。

    1番目 単項演算子の+と-, B-NOT
    2番目 べき乗
    3番目 乗算と除算
    4番目 加算と減算
    5番目 B-AND
    6番目 B-XOR, B-EXOR
    7番目 B-OR

    以下に式の評価の例を示す。

     1 + 2 * 3 

    上の式では、最初に乗算(下記)が実行される。

    1. 2 * 3

      次に、乗算の結果、6を使用して加算が実行される。

    2. 1 + 6

      したがって、式の結果は7となる。

  2. かっこを使用する目的は2通りある。1つは、同じ評価順位の演算子がいくつか続く場合に、演算順序の曖昧さをなくすためである。もう1つは、通常の評価順位を変更することである。かっこによって評価順位が指定されない場合、評価順位が同じ一連の演算は、左から右に進められる。

  3. 算術式の先頭には、記号の"("と "+"と " -" と " B-NOT" または変数だけを書くことができる。算術式の末尾には、記号の")"または変数だけを書くことができる。算術式の中では、左かっこと右かっこは対にする。左かっこが右かっこの左側に来るようにする。

  4. 算術式を使用すると、作用対象の合成(composite of operands)および受取り側データ項目に関する制約を受けずに、算術演算子を組み合わせることができる。たとえば、この章で後述するADD文の構文規則3を参照。

中間結果

式が評価されると、一つ以上の中間結果が出される。概念的に、各中間結果は、一時データ項目として格納され、その値はARITHMETIC指令で選択したパラメーターによって決まる。

ARITHMETIC"MF"指令を選んだ場合、本 COBOL システムは、各中間結果を十進40桁の浮動小数点レジスタに評価する。ゼロでない各中間結果の最上位桁はこのレジスタの最上位桁に位置付けられる。小数点位置は中間結果の値に応じて浮動する。40桁に格納できない桁は切り捨てられる。

ARITHMETIC"TRUNC20" コンパイラ指令を選択すると、Micro Focus COBOLは、ARITHMETIC"MF"を選択した場合と同じ方法で各中間結果を評価する。ただし、20桁を超える小数点の右側の数字は、式の各段階で切り捨てられる。この指令は、COBOL WorkBenchで提供されるものと同様の切り捨てが必要な場合にのみ使用すべきである。 この指令を使用する場合は、INTLEVELコンパイラ指令の初期値、"2"の設定を変えてはならない。これは、一部の新機能(全部で18桁を超える数字PICUTUREなど)をTRUNC20とともに使用できなくなることを意味する。

OS/VS COBOL, VS COBOL II, DOS/VS COBOL, COBOL/370 および OS/390 システムでは、中間結果を、式中の要素のPICTURE句によって決定される精度で計算するので、各バージョンによって多少異なってくる。詳細については、IBM VS COBOL for OS/VSマニュアル、VS COBOL II Application Programming Guide、およびCOBOL for OS/390 & VM V2R2 Programming Guideを参照。各中間結果は、PICTURE 9(n)V9(m) を持つ。n+m の最大値は、選択されたオプションによって 30 または 31 である。

中間結果用にOSVSまたはVSC2オプションを記述した場合、このシステムは以下の制限で、選択されたメインフレームの動作をその結果を適当に切捨てて想定する。