在我的测试期间,以下条件始终返回True
var
Tmp : Boolean;
begin
if(Tmp)
then ShowMessage('True')
else ShowMessage('False');
end;
在编译时,我收到以下警告消息:
[DCC警告] Unit1.pas(30):W1036变量'Tmp'可能不是 初始化
检查未分配的本地Boolean
变量是否总是返回True
还是纯粹的偶然性?
答案 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;