2

我注意到 Progress 4gl 中的 IF 语句有一个非常奇怪的行为。

我定义了一个格式为“999”的整数,它告诉它有 3 位数字,然后我分配一个小于 100 的值(例如 12),然后当我显示它时,它应该显示为“012”。

但是当我在 DISPLAY 语句中添加一个实际上不应该做任何事情的 IF 语句时,变量显示为“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

您的第二个示例类似于:

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 函数返回一个整数并应用整数的默认格式。编译器不会尝试再次猜测您并注意到(在您的示例中)两个结果都是同一个变量。

(在这种情况下,IF 是嵌入在 DISPLAY 中的函数——不是它自己的独立语句。)

要获得您正在寻找的结果:

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

每当我嵌入一个 IF 函数时,我都会把它放在括号中——这有助于清楚地表明它是嵌入的,并清楚地显示了诸如 FORMAT 短语之类的东西适用的地方。

于 2012-10-04T10:38:58.593 回答