今天我的一位朋友问我下面的代码:
var
a: Integer;
begin
ShowMessage(IntToStr(a));
end;
这是局部变量,尚未初始化,好吗?
将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:
我在两台不同的计算机上测试代码。看到同样的结果,对此有何看法?
答案 0 :(得分:10)
由于变量未初始化,因此其值可以是任何值。由于你的结果是'某事',所以没有什么不寻常的事情发生在这里。
答案 1 :(得分:2)
procedure TForm1.Button1Click(Sender: TObject);
var
a: Integer;
begin
ShowMessage(IntToStr(Integer(a)));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(IntToStr(Integer(Pointer(TButtonControl(Button1)))));
end;
在我的机器上,此代码生成相同的消息,编译器使用 ebx 注册 a 变量,而 TButtonControl.WndProc 使用 ebx 存储指向 Self 的指针(因为EAX将在TbuttonControl.WndProc的WinAPI函数调用后被覆盖) button1 ,然后调用实际的处理程序 Button1Click 即可。唉,在Delphi 2007上,消息文本太可预测了。
<强> [编辑] 强> 如果在项目编译器选项编译器 - &gt;调试 - &gt;使用调试DCU 中打开使用调试DCU 选项,您可以在调试时查看VCL内部发生的情况。
答案 2 :(得分:1)
请参阅此类似Stackoverflow question。
在Delphi中,默认情况下不会初始化局部变量。程序员对此负责,并且应该在读取之前设置一个值。单元化变量的值取决于用于该变量的实际分配的存储器单元的内容。所以这里有任何价值。