procedure TForm1.btn1Click(Sender: TObject);
var
Local_Int: Integer; //声明了两个局部变量
Local_Tmp: Integer;
begin
ShowMessage(IntToStr(Local_Tmp)); //显示为一个随机数
ShowMessage(IntToStr(Local_Int)); //显示为 0
if @Local_Int <> nil then
ShowMessage('Local_Int已经分配了内存,且初始化为 ' + IntToStr(Local_Int)); //显示已经分配了内存,并且初始化为 0
end;
按道理来说,局部变量不自动初始化,而是一个随机数,结果在第二个ShowMessage中却显示为 0 ???
为什么呢???请高手解答!!!
var
Local_Int: Integer; //声明了两个局部变量
Local_Tmp: Integer;
begin
ShowMessage(IntToStr(Local_Tmp)); //显示为一个随机数
ShowMessage(IntToStr(Local_Int)); //显示为 0
if @Local_Int <> nil then
ShowMessage('Local_Int已经分配了内存,且初始化为 ' + IntToStr(Local_Int)); //显示已经分配了内存,并且初始化为 0
end;
在你不添加其他代码的情况下,这个函数无论运行多少次, local_int 和 local_tmp 的值都不会变的。
只要不添加以下代码就不会为0 if @Local_Int <> nil then
ShowMessage('Local_Int已经分配了内存,且初始化为 ' + IntToStr(Local_Int)); //显示已经分配了内存,并且初始化为 0
一但添加了这个,就老是Local_Int初始化为0,而不是随机数,每次运行都是这样的???编译器的原因么?
var
Local_Int: Integer;这样子的定义:
if @Local_Int <> nil then //这个条件就是一个“永假”条件后面的ShowMessage永远不会被执行。
至于初始化的值,这个是不确定的,因为这是一个栈空间,只是在更多的情况下会是一个0值。
if @Local_Int <> nil then //这个条件就是一个“永假”条件后面的ShowMessage永远不会被执行。
楼上的大哥,这个语句是True条件,后面的ShowMessage永远都会运行,因为Local_Int肯定已经分配了内存,只要分配了内存,@Local_Int指向肯定不是nil了。至于为什么每次Local_Int都是0的疑问继续…………思考和寻求答案中……
那两个随机数,还是没有变
ShowMessage(IntToStr(Local_Int)); //显示已经分配了内存,并且初始化为 0 把前面的字符串去掉,就不是0了
编译器优化的问题。
@Local_Int这样子去测试任何一个变量都永真的。
还是想请高手解答这个问题,呵呵……