2

進行中のIFステートメント4glで非常に奇妙な動作に気づきました。

3桁の整数を定義する「999」の形式で整数を定義し、100未満の値(例:12)を割り当てます。表示すると、「012」と表示されます。

しかし、実際には何も実行しないはずのIFステートメントをDISPLAYステートメント内に追加すると、変数は「12」と表示されます。

これは、違いを明確にするためのテストコードです。LABELは変数の出力に影響を与えません。

DEF VAR tmp AS INTEGER FORMAT "999".
ASSIGN tmp = 12.

DISPLAY 
    tmp LABEL "disp1".

DISPLAY
    IF TRUE THEN tmp ELSE tmp LABEL "disp2".

フォーマットを">99"に変更しても、同じ動作を実現できます。

私の質問は、IFステートメントが変数の表示方法を変更するのはなぜですか?

よろしく//MrBucket

4

1 に答える 1

3

2番目の例は次のようになります。

define variable tmp1 as integer no-undo format "999".
define variable tmp2 as integer no-undo format "99999".

display
  if true then tmp1 else tmp2
.

コンパイラーは、IF関数が整数を返すことを確認し、整数のデフォルトのフォーマットを適用します。コンパイラーは、2番目にあなたを推測しようとせず、(あなたの例では)両方の結果が同じ変数であることに気づきます。

(この場合、IFはDISPLAY内に埋め込まれた関数であり、それ自体のスタンドアロンステートメントではありません。)

あなたが探している結果を得るために:

display
  ( if true then tmp1 else tmp2 ) format "999"
.

IF関数を埋め込むときは常に、それを括弧で囲むようにします。これは、IF関数が埋め込まれていることを明確にし、FORMAT句などが適用される場所を明確に示すのに役立ちます。

于 2012-10-04T10:38:58.593 に答える