【COBOL学習|豆知識】COMPUTE 文の計算順序を正しく理解し、バグを未然に防ぐ作法

導入:なぜ計算順序の意識が重要なのか

COBOLの現場で長年プログラムを保守していると、数値計算の結果が期待値とわずかにズレているというバグに遭遇することがあります。その原因の多くは、開発者が「自分の脳内での計算順序」と「COBOLコンパイラの評価順序」を混同していることにあります。COMPUTE文は強力ですが、計算順序を正しく把握していないと、致命的な論理エラーを引き起こしかねません。この記事では、安全で可読性の高い演算の作法を解説します。

基礎知識:演算子の優先順位

COBOLのCOMPUTE文において、算術演算子は数学のルールに従い、以下の優先順位で評価されます。

1. 累乗 ():最も優先度が高い
2. 乗算 ()、除算 (/):次に高い
3. 加算 (+)、減算 (-):最も低い

同じ優先順位の演算子が並んでいる場合は、左から右へ順番に計算されます。例えば「A + B C」という式であれば、数学と同じく乗算が先に行われ、その結果にAが加算されます。

実装と解決策:カッコによる明示化

優先順位に依存してコードを書くことは、一見スマートに見えますが、後からコードを読む人(あるいは数年後の自分)にとってはミスを誘発する原因になります。最も確実な解決策は、括弧 ( ) を使って計算順序を明示することです。これにより、意図しない演算順序によるバグを確実に防ぐことができます。

サンプルプログラム

以下に、計算順序がどのように適用されるか、また、括弧で制御する方法を示したサンプルコードを記載します。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. COMPUTE-SAMPLE.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 VAL-A PIC 9(2) VALUE 2.
000600 01 VAL-B PIC 9(2) VALUE 3.
000700 01 VAL-C PIC 9(2) VALUE 4.
000800 01 VAL-D PIC 9(2) VALUE 2.
000900 01 RESULT-1 PIC 9(4).
001000 01 RESULT-2 PIC 9(4).
001100 PROCEDURE DIVISION.
001200 — 優先順位通りに計算されるケース —
001300 A + B C D は (A + (B (C D))) となる
001400 COMPUTE RESULT-1 = VAL-A + VAL-B VAL-C VAL-D
001500 DISPLAY “優先順位のみの結果: ” RESULT-1
001600
001700 — カッコを使って意図を明確にしたケース —
001800 (A + B) (C D) を意図した場合
001900 COMPUTE RESULT-2 = (VAL-A + VAL-B) (VAL-C VAL-D)
002000 DISPLAY “括弧で明示した結果: ” RESULT-2
002100 STOP RUN.

応用・注意点:現場での定石

現場のコーディング規約では、複雑な数式を一行のCOMPUTE文に詰め込むことを禁止している場合がほとんどです。理由は、デバッグの難易度が上がるからです。

中間変数の活用:計算が複雑になる場合は、中間変数を定義して順を追って計算してください。
切り捨て・四捨五入:COMPUTE文の結果を格納するデータ項目の属性(PIC句)によって、小数点以下の扱いや桁あふれ時の動作が変わります。特に除算を含む場合は、ROUNDED句の使用を検討し、精度の管理を徹底しましょう。

「読みやすさは保守性の高さ」です。計算順序を理解した上で、あえて括弧を使って明示的に記述する癖をつけることが、ベテランへの第一歩です。

コメント

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