在COBOL中,以下条件何时计算为true

在COBOL中,以下条件何时计算为true,cobol,Cobol,那条线 01 ws-var-05 pic x value 'n'. 88 ws-var-88 value 'y' 01 ws-var-2 pic 9 value 1. 88 ws-var-88-2 value 2. . . . * comment ws-var-88-2 is set to true when eof is * reached in the at end clause of read statement * need to understand when ws-v

那条线

01 ws-var-05 pic x value 'n'.
   88 ws-var-88 value 'y'
01 ws-var-2 pic 9 value 1.
   88 ws-var-88-2 value 2.

.
.
.
* comment ws-var-88-2 is set to true when eof is 
* reached in the at end clause of read statement
* need to understand when ws-var-05 evaluates to 
* true! Is this right syntax? What happens if we use 
* this syntax? Need to understand if this is a 
* defect

Perform 1000-para until ws-var-88-2 or ws-var-05.
…包含语法错误,至少在使用GNU COBOL 1.1.0编译时是这样

PERFORM动词的UNTIL子句可以包含条件表达式。条件表达式的一种类型是88级的条件名称条件。但是,在本例中,标识符的名称ws-var-05后面必须跟一个条件运算符,=,等等,然后是另一个标识符或一个文本,直到子句有效

这是正确的语法吗

没有

如果我们使用这种语法会发生什么

将发生编译时错误。

有几件事

最好将支持条件项的存储保留为未命名。这可以防止人们意外地将错误的值移动到它们中,并导致细微的错误

例如,这:

Perform 1000-para until ws-var-88-2 or ws-var-05.
最好这样写:

01 ws-var-05 pic x value 'n'.
   88 ws-var-88 value 'y'
01 ws-var-2 pic 9 value 1.
   88 ws-var-88-2 value 2.
因此,没有人会意外地将“Y”移动到ws-var-05。这在大型机上尤其有问题,因为在大型机上有一些自动大写编辑器选项,很难注意到“y”和“y”之间的区别

在这种情况下,有几种情况,ws-var-05不是一个完整的条件,您可以使用ws-var-88或ws-var-88-2,它将是一个完整的条件

最后不需要句点,而且在现代编译器中它的使用经常会有问题。自Cobol-85以来,END verbname是终止命令的首选方式。你可以这样写:

01                pic x value 'n'.
   88 ws-var-88 value 'y'.
01                pic 9 value 1.
   88 ws-var-88-2 value 2.
作为:

或者,IMNSHO,一种更清晰、更清晰的方法,因为它将终止条件与您将在执行主体中执行的命令分离:

Perform 1000-para until (ws-var-88 or ws-var-88-2)
我还将始终使用parens来界定我预期的操作顺序,尽管在这种情况下,这并不重要。对于更复杂的情况,它们可以为那些必须在凌晨3点看到爆炸的待命程序员提供很大的帮助

您可以这样触发终止条件:

Perform until (ws-var-88-2 or ws-var-88-2)
   Perform 1000-para
End-Perform

您的问题只能通过检查设置您要询问的变量的代码部分来回答。谢谢你。
Perform until (ws-var-88-2 or ws-var-88-2)
   Perform 1000-para
End-Perform
1000-para.
   Read myfile
     at end
       set ws-var-88-2 to true
   End-Read
   If (something-else = time-to-quit)
       set ws-var-88 to true
   End-If
   Exit.  *> One of the few places you need a period
          *> in modern cobol, adding the "Exit" or 
          *> "Continue" NOPs clearly calls out to a
          *> reader that you are using a period.