关于PASCAL的一个循环
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/11 03:12:34
关于PASCAL的一个循环
程序
PROGRAM ZLX;
VAR
I:INTEGER;
BEGIN
WRITELN;
FOR I:=1 TO 100 DO
BEGIN
I:=I+100;
WRITELN(' ',I);
READLN;
END;
END.
此程序在FREE PASCAL 里边是错的
但在TP中则可以运行
我知道不能随便改变I的值
但奇怪的是 在TP中
当完成第一次循环后 I=101 已经大于了终值100
因此我认为此循环会结束
结果只有一个 101
但结果却是匪夷所思
以及后面一大堆负值
程序
PROGRAM ZLX;
VAR
I:INTEGER;
BEGIN
WRITELN;
FOR I:=1 TO 100 DO
BEGIN
I:=I+100;
WRITELN(' ',I);
READLN;
END;
END.
此程序在FREE PASCAL 里边是错的
但在TP中则可以运行
我知道不能随便改变I的值
但奇怪的是 在TP中
当完成第一次循环后 I=101 已经大于了终值100
因此我认为此循环会结束
结果只有一个 101
但结果却是匪夷所思
以及后面一大堆负值
我手头没有TP无法做实验.只能猜测一下
我想这个结果可能说明,TP中for循环的终止条件是:循环变量严格等于终止值时跳出.
也就是说,只有当循环执行完毕之后,i=100,循环才会跳出.
但是你这个写法,导致第一次循环执行完毕之后,i已经是101了,虽然大于100,但是程序发现i不等于100,于是继续执行.相当于说,你已经越过终点了,但是是"瞬移"过去的,编译器只盯着100那条线看,没注意到你跳过去了.
要验证这一点,你可以把终止值设为101,202..试试,应该可以结束循环.
再问: 嗯 你的猜测是正确的 的确是这样 谢谢 但还有一点不懂的是 为何之后的每一个循环都加101 而不是i=i+100呢 比如 第一个循环之后 i=1+100=101; 第二循环的i 按照常规来说应该是 i=101+100=201; 但他是202 加了101而不是100 这是怎么回事
再答: 因为for本身也会帮你+1
再问: 嗯 有道理还有这个负数应该怎么解释呢
再答: integer的最大值只有2^15-1 = 32767 大于这个数,如果开了范围检查,会抛错.若没开,就会算术溢出,也就是32767+1 = -32768
我想这个结果可能说明,TP中for循环的终止条件是:循环变量严格等于终止值时跳出.
也就是说,只有当循环执行完毕之后,i=100,循环才会跳出.
但是你这个写法,导致第一次循环执行完毕之后,i已经是101了,虽然大于100,但是程序发现i不等于100,于是继续执行.相当于说,你已经越过终点了,但是是"瞬移"过去的,编译器只盯着100那条线看,没注意到你跳过去了.
要验证这一点,你可以把终止值设为101,202..试试,应该可以结束循环.
再问: 嗯 你的猜测是正确的 的确是这样 谢谢 但还有一点不懂的是 为何之后的每一个循环都加101 而不是i=i+100呢 比如 第一个循环之后 i=1+100=101; 第二循环的i 按照常规来说应该是 i=101+100=201; 但他是202 加了101而不是100 这是怎么回事
再答: 因为for本身也会帮你+1
再问: 嗯 有道理还有这个负数应该怎么解释呢
再答: integer的最大值只有2^15-1 = 32767 大于这个数,如果开了范围检查,会抛错.若没开,就会算术溢出,也就是32767+1 = -32768