变量未初始化时会产生简单的代码

时间:2011-07-23 14:25:31

标签: delphi

今天我的一位朋友问我下面的代码:

var
  a: Integer;
begin
  ShowMessage(IntToStr(a));
end;

这是局部变量,尚未初始化,好吗?

将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:

  1. 点击按钮,查看结果,结果= 1635841
  2. 按Enter键,查看结果,结果= 1
  3. 按Space键查看结果,reuslt = 1636097
  4. 我在两台不同的计算机上测试代码。看到同样的结果,对此有何看法?

3 个答案:

答案 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中,默认情况下不会初始化局部变量。程序员对此负责,并且应该在读取之前设置一个值。单元化变量的值取决于用于该变量的实际分配的存储器单元的内容。所以这里有任何价值。