我有这个cobol程序,意在计算一个阶乘:
IDENTIFICATION DIVISION.
PROGRAM-ID. Factorial-hopefully.
AUTHOR. Darth Egregious.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Keeping-Track-Variables.
05 Operand PIC S99 VALUE 0.
05 Product PIC S99 VALUE 1.
PROCEDURE DIVISION.
PERFORM-FACTORIAL.
DISPLAY SPACES
PERFORM VARYING Operand FROM 6 BY -1 UNTIL Operand = 0
DISPLAY "Before Product " Product " Operand " Operand
MULTIPLY Product By Operand GIVING Product
DISPLAY "After Product " Product " Operand " Operand
END-PERFORM
DISPLAY Product.
STOP RUN.
Run Code Online (Sandbox Code Playgroud)
我像这样运行它:
cobc -free -x -o a.out fact.cbl && ./a.out
Run Code Online (Sandbox Code Playgroud)
我得到了这个奇怪的输出:
Before Product +01 Operand +06
After Product +06 Operand +06
Before Product +06 Operand +05
After Product +30 Operand +05
Before Product +30 Operand +04
After Product +30 Operand +04
Before Product +30 Operand +03
After Product +90 Operand +03
Before Product +90 Operand +02
After Product +90 Operand +02
Before Product +90 Operand +01
After Product +90 Operand +01
+90
Run Code Online (Sandbox Code Playgroud)
我的递减循环按预期工作,但MULTIPLY命令行为奇怪.它正在做1*6,并且6*5正确,但30*4似乎不起作用,然后30*3做,最后90*2再也不起作用.COBOL不喜欢乘以2或2的幂吗?
我的递减循环正在按预期工作,但MULTIPLY命令表现得很奇怪.它正确地做1*6和6*5,但30*4似乎不起作用,然后30*3,但最终90*2不再起作用.COBOL不喜欢乘以2或2的幂吗?
05 Operand PIC S99 VALUE 0.
05 Product PIC S99 VALUE 1.
Run Code Online (Sandbox Code Playgroud)
当你乘30*4和90*2,该值比更大的PICTURE条款,S99.
例如,将PIC条款的大小增加到S999.
回复评论:
从技术上讲,结果是undefined [ COBOL 85],因此什么都不做是一个有效的选择.其他实现将截断该值以给出不同的结果.
所以它不是语言,而是实现.
该语言还允许该SIZE ERROR短语捕获截断错误.在那种情况下,结果是不变的,但可以执行附加代码以指示发生错误.
使用COBOL 2002,结果由实现者定义,如果ON SIZE ERROR未指定短语并且检查EC-SIZE-TRUNCATION异常未激活.
引自2002年标准:
F.1可能影响现有计划的实质性变化
15)没有SIZE ERROR短语的大小错误条件.如果出现大小错误情况,则发生它的语句不包含SIZE ERROR或NOT SIZE ERROR短语,并且没有关联的声明,实现者定义运行单元是否终止或继续执行不正确的值.
理由:
在之前的COBOL标准中,大小错误的规则表明执行将继续使用未定义的值,但不清楚执行将继续的位置,特别是在条件语句中.此外,对于许多关键应用程序而言,继续执行不正确的结果是不可接受的,因为它可能导致数据库损坏,程序的错误继续执行以及潜在的大量其他错误.修改程序以禁止为每个受影响的语句添加ON SIZE ERROR是令人望而却步的.为响应用户需求,一些实现者在这种情况下终止了程序的执行; 在某些情况下,实现者允许基于编译器指令选择终止.
在这种情况下终止的应用程序的数量和关键性为此更改提供了强有力的理由.预计此更改对现有程序几乎没有影响,因为实现者可以根据其先前COBOL标准的实现自由继续或终止.