Cobol if语句

Cobol if语句,cobol,Cobol,哪种逻辑更好或更有效: IF VAR-A = FALSE MOVE VAR-C TO VAR-B ELSE MOVE VAR-A TO VAR-B END-IF 或 我更喜欢这样: IF VAR-A = TRUE MOVE VAR-A TO VAR-B ELSE MOVE VAR-C TO VAR-B END-IF 一般来说,如果一个为false,那么对它采取行动是很难理解的,所以我更喜欢正面陈述。我认为效率差异并不重要(特别是在使用COBOL时)。不管怎样,编译器通

哪种逻辑更好或更有效:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF

我更喜欢这样:

IF VAR-A = TRUE
   MOVE VAR-A TO VAR-B
ELSE
   MOVE VAR-C TO VAR-B
END-IF
一般来说,如果一个
为false,那么对它采取行动是很难理解的,所以我更喜欢正面陈述。我认为效率差异并不重要(特别是在使用COBOL时)。不管怎样,编译器通常会做正确的事情。

我更喜欢这样:

IF VAR-A = TRUE
   MOVE VAR-A TO VAR-B
ELSE
   MOVE VAR-C TO VAR-B
END-IF

一般来说,如果一个
为false,那么对它采取行动是很难理解的,所以我更喜欢正面陈述。我认为效率差异并不重要(特别是在使用COBOL时)。不管怎样,编译器通常会做正确的事情。

但我更喜欢这种编码方式

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF
这是因为,为了处理/执行条件/循环/求值语句,编译器需要注意它们,并为此编写等效的编译器代码

例如,如果我们的场景中出现的错误场景少于50%,那么我们可以将该值移动到变量中,使其始终为TRUE,这样可以避免使用if和if,而不使用其他变量总是不那么复杂。


你说呢?

但我更喜欢这种编码方式

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF
这是因为,为了处理/执行条件/循环/求值语句,编译器需要注意它们,并为此编写等效的编译器代码

例如,如果我们的场景中出现的错误场景少于50%,那么我们可以将该值移动到变量中,使其始终为TRUE,这样可以避免使用if和if,而不使用其他变量总是不那么复杂。


你怎么说?

一般来说,两者都可以,你应该把优化留给你的编译器

然而,由于源代码是为人类编写的,以了解以前的程序员创建了什么,我想说:

如果可能出现以下任一情况,请使用此表格:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF
但如果IF条件是一种非常罕见的情况,而unqualified MOVE是99%的条件,请尝试这种方法,因为它突出了VAR-a=FALSE是一种罕见而特殊的情况:

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF

只有我的NSH$0.02。这两种方法都可以很好地工作,只要您记住编译器会接受您输入的大部分垃圾,您主要关心的是下一个必须阅读您的程序的人。

一般来说,这两种方法都可以,您应该将优化留给编译器

然而,由于源代码是为人类编写的,以了解以前的程序员创建了什么,我想说:

如果可能出现以下任一情况,请使用此表格:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF
但如果IF条件是一种非常罕见的情况,而unqualified MOVE是99%的条件,请尝试这种方法,因为它突出了VAR-a=FALSE是一种罕见而特殊的情况:

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF

只有我的NSH$0.02。这两种方法都能很好地工作,只要你记住编译器会接受你提供给它的大部分垃圾,你主要关心的是下一个必须阅读你的程序的人。

第一种方法效率更高,除非VAR-A从不为false(在这种情况下,只需删除它)。条件必须始终运行,并且必须始终发生一个分配,因此这是最佳的:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF
就个人而言,为了便于阅读,我更喜欢先评估真实情况

IF VAR-A = TRUE
   MOVE VAR-A TO VAR-B
ELSE
   MOVE VAR-C TO VAR-B
END-IF
没有性能差异,因为无论哪种方式,它都是一个分支。如果要检查多个值,则始终希望将最常见的放在第一位

EVALUATE TRUE
  WHEN VAR-A = TRUE
    MOVE VAR-A TO VAR-B
  WHEN VAR-C = TRUE
    MOVE VAR-C TO VAR-B
  WHEN OTHER
    this is slower, because it had to do two condition checks to get here
    MOVE VAR-C TO VAR-B
END-EVALUTE
但这不适用于简单的情况,如您所见:

IF condition
   no effort to get here
   assignment cost is constant
   one go-to to get to the next line
ELSE
   one go-to to get here
   assignment cost is constant
   no effort to get to the next line
END-IF

但这真的是吹毛求疵。我们这里讨论的是一些说明。除非这是在一个每分钟运行1000000次的内部循环中运行的,否则不要去想它。

第一个循环更有效,除非VAR-a从来都不是false(在这种情况下,只需删除它)。条件必须始终运行,并且必须始终发生一个分配,因此这是最佳的:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF
就个人而言,为了便于阅读,我更喜欢先评估真实情况

IF VAR-A = TRUE
   MOVE VAR-A TO VAR-B
ELSE
   MOVE VAR-C TO VAR-B
END-IF
没有性能差异,因为无论哪种方式,它都是一个分支。如果要检查多个值,则始终希望将最常见的放在第一位

EVALUATE TRUE
  WHEN VAR-A = TRUE
    MOVE VAR-A TO VAR-B
  WHEN VAR-C = TRUE
    MOVE VAR-C TO VAR-B
  WHEN OTHER
    this is slower, because it had to do two condition checks to get here
    MOVE VAR-C TO VAR-B
END-EVALUTE
但这不适用于简单的情况,如您所见:

IF condition
   no effort to get here
   assignment cost is constant
   one go-to to get to the next line
ELSE
   one go-to to get here
   assignment cost is constant
   no effort to get to the next line
END-IF

但这真的是吹毛求疵。我们这里讨论的是一些说明。除非这是在一个每分钟运行1000000次的内部循环中运行,否则不要想它。

我对cobol了解不多,但第一个循环总是进行测试和存储。第二个可能做一个测试和两个存储。我不太懂cobol,但第一个总是做一个测试和一个存储。第二个可能做一个测试和两个存储。