在Cobol中,为了测试“null或empty”,我们使用“NOT = SPACE [AND / OR] LOW-VALUE”?这是什么?

时间:2010-11-04 09:04:26

标签: cobol

我现在在大型机上工作, 在某些模块中,进行测试

  

不为空或空

我们看到:  NOT = SPACE OR LOW-VALUE 酋长说我们应该这样做: NOT = SPACE AND LOW-VALUE

是哪一个?

谢谢!

4 个答案:

答案 0 :(得分:22)

酋长是正确的。

COBOL 假设读取类似自然语言的东西(事实证明这是公正的 另一个糟糕的笑话。)

让我们玩下列变量和值:

 A = 1
 B = 2
 C = 3

表达式如:

IF A NOT EQUAL B THEN...

相当直接理解。一个不等于两个,所以我们会这样做 在THEN之后的任何内容。然而,

IF A NOT EQUAL B AND A NOT EQUAL C THEN...

完全难以理解。一个不等于两个,一个不是 等于三,所以我们将做'THEN'之后的任何事情。

COBOL有一个简短的手工构造,永远不应该使用恕我直言。它很困惑 每个人(包括我不时)。短手表达式可让您将上述内容简化为:

IF A NOT EQUAL B AND C THEN...

或者如果愿意的话 喜欢申请De Morgans rule:

IF NOT (A EQUAL B OR C) THEN...  

我的建议是在exprssions中避免使用NOT,并且从不使用COBOL短手表达式。

你真正想要的是:

 IF X = SPACE OR X = LOW-VALUE THEN...
    CONTINUE
 ELSE
    do whatever...
 END-IF

当'X'包含空格或低值(空值)时,上述操作无效。它 与...完全相同:

 IF NOT (X = SPACE OR X = LOW-VALUE) THEN
    do whatever...
 END-IF

哪些可以转化为:

 IF X NOT = SPACE AND X NOT = LOW-VALUE THEN...

最后......

 IF X NOT = SPACE AND LOW-VALUE THEN...

我的建议是坚持简单理解更长和更直接的表达方式 在COBOL中,忘记简短的废话。

答案 1 :(得分:2)

值得注意的是,null值并不总是与低值相同,这取决于制造商确定的设备架构及其使用的字符集。与使用linux或windows的设备相比,大型机可以具有完全不同的整理顺序(低到高字符代码和符号顺序)和符号集,因为您现在无疑已经看到过。 Cobol中用于比较的简写有时用于布尔运算,如IF A GOTO PAR-5和IF A OR C THEN ....并且可以与两个变量或变量和文字值的比较结合使用。不同设备上的解析器和编译器应该以标准(ANSI)方法处理这些情况,但情况并非总是这样。

答案 2 :(得分:2)

在COBOL中,没有Java null这样的东西,它永远不会“空”。

例如,取一个字段

 05  FIELD-1  PIC X(5).

该字段将始终包含某些内容。

MOVE LOW-VALUES TO FIELD-1.

现在它包含hexadimal零。 x'0000000000'

MOVE HIGH-VALUES TO FIELD-1.

现在它包含所有二进制文件:x'FFFFFFFFFF'

MOVE SPACES TO FIELD-1.

现在每个字节都是一个空格。 x'4040404040'

声明字段后,它指向内存中的某个区域。必须将该内存区域设置为某个内容,即使您从未对其进行修改,它仍然会在程序加载之前具有垃圾。除非你初始化它。

05  FIELD-1 PIC X(6) VALUE 'BARUCH'.

答案 3 :(得分:1)

我同意NealB。保持简单,避免“捷径”,使其易于理解,而无需参考手册来检查。

IF ( X EQUAL TO SPACE ) 
OR ( X EQUAL TO LOW-VALUES )
   CONTINUE
ELSE
   do whatever...
END-IF

但是,为什么不在X上放一个88,并保持简单?:

88  X-HAS-A-VALUE-INDICATING-NULL-OR-EMPTY VALUE SPACE, LOW-VALUES.

IF X-HAS-A-VALUE-INDICATING-NULL-OR-EMPTY
    CONTINUE
ELSE
   do whatever...
END-IF

注意,在Mainframe Cobol中,NULL的含义非常有限,并不是你所知道的含义,Tom。 “Empty”仅表示特定编码器生成的上下文中的某些内容(就字段而言,它对Cobol没有任何意义)。

我们没有“字符串”。因此,我们没有“空字符串”(长度为1的字符串,包括字符串终结符)。我们没有字符串,所以字段总是有一个值,所以除了程序员所说的之外,它永远不会是“空的”。

Oguz,我认为你的帖子说明了一些非常复杂的东西,以及它如何导致错误。你能测试一下你的情况吗?