检查未分配的布尔局部变量总是返回True?

时间:2019-09-03 14:44:08

标签: delphi variables

在我的测试期间,以下条件始终返回True

var
  Tmp : Boolean;
begin
  if(Tmp)
  then ShowMessage('True')
  else ShowMessage('False');
end;

在编译时,我收到以下警告消息:

  

[DCC警告] Unit1.pas(30):W1036变量'Tmp'可能不是   初始化

检查未分配的本地Boolean变量是否总是返回True还是纯粹的偶然性?

3 个答案:

答案 0 :(得分:5)

在我的测试应用中

if (Tmp) then

编译为

cmp byte ptr[ebp-$05],0
jz +$0c

所以这是一个简单的测试,用于检查栈中Tmp变量的内容是否为零。

被测试堆栈位置的值由堆栈的先前使用确定,因此从统计角度来看,很有可能不是零而不是零。因此,您的观察。

答案 1 :(得分:4)

未初始化的变量具有不确定的值。可以为true或false。

答案 2 :(得分:2)

布尔值或多或少是“语言包装”字节。当它未初始化时,它包含一个“随机”整数值。 (这取决于调用方法时堆栈上的内容)。

所以您的代码与

几乎相同
var
  Tmp : Byte;
begin
  if (Tmp = 0)
  then ShowMessage('True')
  else ShowMessage('False');
end;

未初始化的字节可以为0吗?对。布尔值也一样,可以为False。

作为旁注,将布尔值实现为Integer值的事实正是我们不针对TRUE进行测试的原因。

var
  b : Boolean;
begin
  B := Boolean(128);

  if B = True then //128 <> 1
    ShowMessage('This message won''t show'); 
  if B then
    ShowMessage('This message will show');
end;