導入
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-NAME(PIC 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で実行し、どこが切り捨てられるか確認してみましょう。