我现在在大型机上工作, 在某些模块中,进行测试
我们看到:不为空或空
NOT = SPACE OR LOW-VALUE
酋长说我们应该这样做:
NOT = SPACE AND LOW-VALUE
是哪一个?
谢谢!
答案 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,我认为你的帖子说明了一些非常复杂的东西,以及它如何导致错误。你能测试一下你的情况吗?