所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([DCC警告] W1036变量'x'可能尚未初始化),但不会对记录成员发出警告.所以我决定进行测试.
对于所有记录成员,我总是从Integers得到0而从布尔都得到假.
我尝试打开和关闭各种编译器选项(调试,优化等),但没有区别.我的所有记录成员都正在初始化.
我错过了什么?我正在使用Delphi 2009 Update 2.
program TestInitialization;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TR = Record
Public
i1, i2, i3, i4, i5: Integer;
a: array[0..10] of Integer;
b1, b2, b3, b4, b5: Boolean;
s: String;
End;
var
r: TR;
x: Integer;
begin
try
WriteLn('Testing record. . . .');
WriteLn('i1 ',R.i1);
WriteLn('i2 ',R.i2);
WriteLn('i3 ',R.i3);
WriteLn('i4 ',R.i4);
WriteLn('i5 ',R.i5);
Writeln('S ',R.s);
Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' …Run Code Online (Sandbox Code Playgroud) 函数的Result变量是否有任何保证的默认值,如0,''或nil?或者结果总是在使用前初始化?
我有一个函数返回一个这样的字符串:
function Foo(): String
begin
while {...} do
Result := Result + 'boingbumtschak';
end;
Run Code Online (Sandbox Code Playgroud)
它运行正常,但现在我得到一些字符串,其中包含之前调用该函数的内容.当我Result := ''在开头添加一个,它没关系.我什么时候应该初始化Result变量,什么时候不需要?(字符串,基元,类实例(零))
我需要澄清这个案子.
根据我的测试,Result变量定义为:Boolean = False,Integer = 0,String ='',Object = nil等来自第一行.但我从未见过这方面的官方参考.它也有意义,因为这给出了提示.
[DCC警告] Unit1.pas(35):H2077分配给'TForm1.Test'的值从未使用过
function TForm1.Test: Boolean;
begin
Result := False;
// Some arbitrary code here
Result := True;
end;
Run Code Online (Sandbox Code Playgroud)
但是如果我注释掉第一行并且在最后一行之前的某个地方有异常会发生什么?结果=假吗?
如果Result未定义,这意味着我总是必须通过在以后异常的情况下定义Result来启动每个函数.这对我来说毫无意义.
可能重复:
Delphi中Result的默认值是什么
与此问题类似,我现在问以下问题.
function Test:Boolean;
begin end;
Run Code Online (Sandbox Code Playgroud)
结果值是否总是保证为假(0)?整数值不是,布尔值也是如此?