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,但第一个总是做一个测试和一个存储。第二个可能做一个测试和两个存储。