函数的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 追月
  • 开始时间 开始时间

追月

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=50000 to 82500 do
begin
if IsLeapYear(i) then memo1.Lines.Add(inttostr(i));
end;
end;

这是一个调用闰年函数的练习,在这里调用了SysUtils单元的IsLeapYear函数,我在这里感到不解的是:
function IsLeapYear(Year: Word): Boolean;
这里的Year数据类型是Word,而Word数据类型是从0..65535。为什么我上面的循环语句子变量已经超出了这个范围,程序却没有报内存溢出的出错信息。
 
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=50000 to 82500 do
begin
if IsLeapYear(i) then memo1.Lines.Add(inttostr(i));
end;
end;

这是一个调用闰年函数的练习,在这里调用了SysUtils单元的IsLeapYear函数,我在这里感到不解的是:
function IsLeapYear(Year: Word): Boolean;
这里的Year数据类型是Word,而Word数据类型是从0..65535。为什么我上面的循环语句子变量已经超出了这个范围,程序却没有报内存溢出的出错信息。
 
1. 你在调用IsLeapYear的时候, 实际传给IsLeapYear函数的参数是一个Word类型的数值;
2. 例如: 当你程序中的i=82500(0x14244)的时候, 传给IsLeapYear的Word类型的值实际上是直接取整数(integer)i的后两个字节0x4244(=16964);
3. 你可以自己调试观察到传递的过程中的内容的;
4. 如果你编译的时候选择range checking选项,则运行的时候会出错误的...
 
接受答案了.
 
后退
顶部