这是个问题吗? (100分)

  • 主题发起人 主题发起人 only you
  • 开始时间 开始时间
O

only you

Unregistered / Unconfirmed
GUEST, unregistred user!
请看下面的代码段:
问题是,函数中的变量在下次进入此函数时会丢失先前的值,但返回值却保持上一次的值,为什么?
function TestVariable(var i:Integer):String;
var
S:String;
begin
if I=0 then
S:='OK';
Result:=S;
end;

function TestResult(var i:Integer):string;
var
k:integer;
begin
if i=0 then
Result:='K='+InttoStr(K)+' OK';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 3 do
begin
Showmessage(TestResult(i));
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 3 do
begin
Showmessage(TestVariable(i));
end;
end;
 
>>函数中的变量都可以在下次进入此函数时清空,但返回变量却保持上一次的值,为什么
这应是.变量的作用域(生存期) 的问题
函数中是变量的作用域是整个涵数当函数结束变量也释放.
而函数的返回值却是全局变量. 它是在你的整个模块退出进释放.

以上是我的愚见.


 
跟你的变量和result没有初始化有关系
 
你的testvariable中的s在每次调用的时候都会初始化为'',所以你的Result会被赋值,但是
testvariable中的result在i<>0是,没有被赋值,他的返回值就是不可预制的结果
(可能这不一定,和你的运行环境有关),个人意见,仅供参考!
 
在函数中每次重新申明S,系统自动初始化为空,因此若不赋值,则返回空。
function TestVariable(var i:Integer):String;
var
S:String;
begin
if I=0 then
S:='OK';
Result:=S;
end;

Result没初始化,亦为该地址的上一次的数值。
function TestResult(var i:Integer):string;
var
k:integer;
begin
if i=0 then
Result:='K='+InttoStr(K)+' OK';
end;
 
同意楼上的说法。
 
我认为 chshanghai 说的有道理,我们的编译程序为每个函数都定义了返回指针,这个
返回指针对引用单元始终有效,该指针指向函数的返回值,正是因为它只是个指针,所以
当我们未对返回值进行任何操作时,该内存单元的值始终存在,也就是说在将函数返回指针压
入堆栈时由于该指针值没有发生任何变化,所以给我的现象是返回值仍然是刚开始时赋的值
而对于函数局部变量,因为每次在函数进入之前才为它开辟内存单元,所以它的指针值始终
处于变化之中,这也是它的值不确定的原因,而对于字符串类型的变量,由于DELPHI对该变量
采用的是动态分配的方法,所以该变量每次都会初始化为空以保证程序的正确和稳定性。
谢谢 chshanghai 的回答,你的想法与我想的一样,但我认为函数指针在程序运行开始就已经确定了,
直到程序结束也不会发生变化,类似于一个全局常量。

不知我的想法是否正确,请大家继续讨论!
 
没人发表新看法吗?
 
>>我认为函数指针在程序运行开始就已经确定了,
>>直到程序结束也不会发生变化,类似于一个全局常量。
哪也不一定 不一定在程序逻辑运行就开始了 而应是在程序逻辑加载到内存后就存在
和当程序被释放时结束.
最简单的例子就是 dll 或 定义在 对象中的 方法 只有当对象被实例化并create
后才会有方法.
 
接受答案了.
 

Similar threads

A
回复
0
查看
1K
Andreas Hausladen
A
S
回复
0
查看
709
SUNSTONE的Delphi笔记
S
S
回复
0
查看
704
SUNSTONE的Delphi笔记
S
A
回复
0
查看
982
Andreas Hausladen
A
后退
顶部