本文へスキップ
BecomeCoder

COBOLコース · 第4章 基本の命令 ― MOVE・演算・条件分岐 · レッスン19

MOVE文 ― データを移す基本、桁あふれの注意

ブラウザで完結

導入

COBOLで「値を代入する」ときに使う最も基本的な命令が MOVE文 です。多くの言語の =(代入演算子)に相当しますが、COBOLならではの独特な挙動——桁あふれに注意が必要です。

説明

       01  WS-NAME              PIC X(10).
       01  WS-SHORT-NAME        PIC X(5).
       01  WS-COUNT             PIC 9(3).

       PROCEDURE DIVISION.
           MOVE "TANAKA" TO WS-NAME.
           DISPLAY WS-NAME.

           MOVE 42 TO WS-COUNT.
           DISPLAY WS-COUNT.
  • MOVE 送り元 TO 送り先. … 「送り元」の値を「送り先」に移す(コピーする)命令。多くの言語の 送り先 = 送り元 の順序がであることに注意してください。
  • MOVE "TANAKA" TO WS-NAME.WS-NAMEPIC X(10))に "TANAKA"(6文字)を入れると、残りの4文字は自動的に空白で埋められ、"TANAKA " になります。

ここで重要なのが桁あふれです。送り先より大きなデータをMOVEすると、はみ出した部分は警告なく切り捨てられます

      *> WS-SHORT-NAME は PIC X(5)(5文字)
           MOVE "YAMAMOTO" TO WS-SHORT-NAME.
           DISPLAY WS-SHORT-NAME.
      *> 結果: "YAMAM"(6文字目以降の "OTO" は切り捨てられる)

数値でも同じことが起こります。

      *> WS-COUNT は PIC 9(3)(3桁、000〜999)
           MOVE 12345 TO WS-COUNT.
           DISPLAY WS-COUNT.
      *> 結果: 345(上位の桁 "12" が切り捨てられる)

このように、COBOLは桁数を超えたデータを黙って切り捨てます(コンパイル時の警告が出ることはありますが、実行時エラーにはなりません)。レッスン12で「桁数がデータの一部」と説明したのはこのためです。送り先のPICTURE句が、送り元のデータを十分に受け止められるか、常に意識する必要があります。

試すには

PIC X(3)変数に4文字以上の文字列をMOVEするコードと、PIC 9(2) の変数に3桁の数値をMOVEするコードをそれぞれ書いて、Playgroundで実行し、どこが切り捨てられるか確認してみましょう。

実際に動かしてみよう

下のエディタにCOBOLを書いて「実行」を押すと、学習用シミュレータが DISPLAY の出力を表示します(本物のGnuCOBOLではなく、教材の範囲を再現した軽量エンジンです)。PICTURE句の桁数・ゼロ詰め・切り捨てなどCOBOLらしい挙動もそのまま体験できます。本文の例を書き換えて動かしてみましょう(ファイル処理やCALLなど一部の機能は対象外です)。

COBOL — ブラウザ内で実行(学習用シミュレータ)

COBOLの教材サブセットを動かす学習用シミュレータを読み込みます(本物のGnuCOBOLではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。