1. 導入:なぜ条件式で「意図しない動き」が起きるのか?
こんにちは。COBOL一筋のベテラン技術者です。皆さんは、IF文で複雑な条件を書いたとき、「テストデータでは通ったのに、本番環境でなぜか別のルートに分岐した」という経験はありませんか?その原因の多くは、論理演算子の「優先順位」を勘違いしていることにあります。この優先順位を理解することは、読みやすく、バグの少ないコードを書くための第一歩です。
2. 基礎知識:演算子の評価ルール
COBOLのIF文で条件を組み合わせる際、論理演算子には評価される順番が決まっています。
優先順位が高い順に:
1. NOT (否定)
2. AND (論理積)
3. OR (論理和)
この順序があるため、例えば「A OR B AND C」と書くと、コンピュータは勝手に「A OR (B AND C)」というグループで計算してしまいます。「(A OR B) AND C」という動作を期待していた場合、ここで致命的なロジックエラーが発生するのです。
3. 実装・解決策:カッコで制御する
この問題を解決する最も確実で賢い方法は、「カッコを省略しない」ことです。
複雑な条件式を書くときは、自分の意図をコンパイラに伝えるために、必ずカッコで囲みましょう。カッコで囲まれた部分は最優先で評価されるため、誤解のない明確なコードになります。
4. サンプルプログラム
以下のコードで、優先順位の違いを比較してみましょう。
- プログラム例
IDENTIFICATION DIVISION.
PROGRAM-ID. LOGIC-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FLAG-A PIC X VALUE ‘N’.
01 FLAG-B PIC X VALUE ‘Y’.
01 FLAG-C PIC X VALUE ‘Y’.
PROCEDURE DIVISION.
> — 優先順位の誤解例 —
> システムは (B AND C) を先に評価するため、AがNでも条件が成立してしまう
IF FLAG-A = ‘Y’ OR FLAG-B = ‘Y’ AND FLAG-C = ‘Y’
DISPLAY ‘意図しない分岐:この行は実行されてしまいます’
END-IF.
> — 推奨される書き方 —
> カッコで優先順位を明示する(AまたはBのどちらかがY、かつCもYであること)
IF (FLAG-A = ‘Y’ OR FLAG-B = ‘Y’) AND FLAG-C = ‘Y’
DISPLAY ‘意図通りの分岐:論理が明確です’
ELSE
DISPLAY ‘条件不成立’
END-IF.
STOP RUN.
5. 応用・注意点:現場で生き残るためのテクニック
現場でのメンテナンス性を考えると、「条件式が3つ以上並んだら、例外なくカッコで括る」というルールを自分の中で決めておくのがおすすめです。
また、複雑すぎる条件式は、IF文の中に書かずに、一度「フラグ(88レベルなど)」に条件を格納してから判定するようにしましょう。
例:
88 CONDITION-OK VALUE TRUE.
IF CONDITION-OK …
このように記述することで、コードの可読性が格段に向上し、後からコードを読むメンバー(あるいは未来の自分)に感謝されるプログラムになります。複雑な条件ほど、シンプルに分割する勇気を持つことが大切です。

コメント