可以在一行中初始化某些类型的多个变量吗?

时间:2014-04-27 09:56:48

标签: delphi variables initialization

我一直在努力编写尽可能少的代码。 所以,我用:

MyBoolean := Memo1.Text <> '';

而不是

if Memo1.Text = '' then
  MyBoolean := true
else
  MyBoolean := false;

声明并初始化

var
  myGlobal: integer = 99;

声明并初始化全局变量。我想对局部变量做同样的事情,但似乎不可能,所以,我想知道是否有办法在一行中初始化某些类型的多个变量,比如C

int x, y, z;
x=y=z=0;

谢谢。

4 个答案:

答案 0 :(得分:6)

在C赋值中是一个表达式(返回一个值)。

在Pascal中,赋值是语句(不返回值)。

差异有一些有趣的后果。例如在C中

while (x=0)

while (x==0)
在Pascal中,

是语法上有效的构造(它是无数错误的根源)

while (x:=0)

在语法上无效,因为x:=0语句

答案 1 :(得分:4)

您只能为每个语句初始化一个局部变量。

答案 2 :(得分:0)

当然可以写一个函数

function AssignInteger(var _AssignTo: integer; _Value: integer): integer;
begin
  Result := _Value;
  _AssignTo := _Value;
end;

并像这样使用它:

var
  i, j, k: integer;
begin
  i := AssignInteger(j, AssignInteger(k, 5));

但这不是你想要的,说你想写尽可能短的代码。

尽管如此,我还是指出了这一点。

答案 3 :(得分:0)

正如dummzeuch所说,你可以编写自己的例程。但是,我更喜欢带有签名的人:procedure AssignIntegers(AValue, ATargetArray);。理想情况下,请使用AssignInteger(99, [X, Y, Z]);调用例行程序。

不幸的是,理想选项不起作用,但以下程序足够接近并且应该足够了。它的工作原理是指向需要分配的整数。

procedure AssignIntegers(AValue: Integer; const ATargets: array of PInteger);
var
  I: Integer;
begin
  for I := Low(ATargets) to High(ATargets) do
    ATargets[I]^ := AValue;
end;

以下DUnit测试用例表明它有效。您甚至可以随时保留这些整数指针的数组以便重新分配。

type
  TArrayPInteger = array of PInteger;
procedure TDelphiTests.TestAssignIntegers;
var
  X,Y,Z: Integer;
  LGroup: TArrayPInteger;
begin
  AssignIntegers(1, [@X, @Y, @Z]); { Pass open arrray using addresses of integers to initialise }
  CheckEquals(1, X);
  CheckEquals(1, Y);
  CheckEquals(1, Z);

  LGroup := TArrayPInteger.Create(@X, @Y); { Handy technique to initialise dynamic arrays }
  AssignIntegers(2, LGroup);
  CheckEquals(2, X);
  CheckEquals(2, Y);
  CheckEquals(1, Z); { Not part of group }
end;

警告

唯一真正的缺点是您丢失了类型检查。编译器不会阻止您传递非整数类型的地址。这可能会导致其他结构的破坏。数据或访问违规。