Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 可以在一行中初始化多个类型的变量吗?_Delphi_Variables_Initialization - Fatal编程技术网

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

Delphi 可以在一行中初始化多个类型的变量吗?,delphi,variables,initialization,Delphi,Variables,Initialization,我一直在努力写尽可能少的代码。 因此,我使用: MyBoolean := Memo1.Text <> ''; 声明并初始化 var myGlobal: integer = 99; 声明和初始化全局变量。我想对局部变量也这样做,但似乎不可能,所以,我想知道是否有一种方法可以在一行中初始化多个某种类型的变量,比如在C中 int x, y, z; x=y=z=0; 谢谢。每个语句只能初始化一个局部变量 在C中赋值是一个表达式(返回一个值) 在Pascal中,赋值是一条语句(不返回

我一直在努力写尽可能少的代码。 因此,我使用:

MyBoolean := Memo1.Text <> '';
声明并初始化

var
  myGlobal: integer = 99;
声明和初始化全局变量。我想对局部变量也这样做,但似乎不可能,所以,我想知道是否有一种方法可以在一行中初始化多个某种类型的变量,比如在C中

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

谢谢。

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

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

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

这种差异产生了一些有趣的结果。例如,在C语言中,两者都有

while (x=0)

在帕斯卡语中是语法上有效的结构(它是无数错误的来源)

while (x:=0)

语法上无效,因为
x:=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));
但这并不是你想要的,说你想写尽可能短的代码

尽管如此,我还是要指出这一点以防万一。

如前所述,您可以编写自己的例程。但是,我更喜欢签名为:
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;
警告
唯一真正的缺点是您丢失了类型检查。编译器不会阻止您传递非整数类型的地址。这可能导致损坏其他结构的数据或访问冲突。

好吧,是和否。是用于写入,例如
X:Integer=99;Y:整数=99在一行上,并且不允许使用多个assimment语句。如果使用Ctrl+D(也称为代码格式),这并不是一行的内容。是的,但是无法在一条语句中初始化多个变量。我很高兴是这样,因为像
x=y=z=0
这样的语句对我来说很难理解。就我个人而言,我甚至会写上好几行。Edjis,我钦佩你对干燥的承诺(不要重复你自己)。不幸的是,Delphi倾向于采用WET的形式(我们喜欢打字或写两遍)。该语言没有实现许多语法糖分,可以减少重复代码,例如三元运算符:x if a else c、多重赋值、更好的运算符优先级(避免在带有布尔运算符的语句中使用括号)、幂运算符、步进for循环、case语句中的字符串、切片表示法、,类型推断等等。我希望一旦他们使用了新的编译器,我们就能得到其中的一些东西。@alcalde,为什么?我不知道。也许是因为当我阅读东西时,我的大脑通常不关注表达中的内容。所以,我不知道,也许我害怕在阅读时会丢失那些
y
z
变量。关于临时变量,它们有什么问题?我宁愿清楚地看到所写的内容,也不愿害怕额外的作业。此外,在生成的汇编代码中,它将是相同的。或者你认为有一条指令可以同时将一个函数的返回值分配给三个变量吗?我完全不明白这和这个问题有什么关系。问题是一次初始化多个变量。在Python中,赋值是一个语句,不能像Pascal那样在while循环中赋值变量。但是,x=y=z=0也是一个有效的语句。这两个概念之间绝对没有关系。@阿尔卡德我对Python不够熟悉,不知道该语言的意图,但相关性可能取决于您如何看待它的赋值功能:(1)赋值是否被视为一个带有语法盐的表达式,以防止常见错误(如while循环)?(2)还是把它当作句法糖的语句来简化多个值的分配?……我个人认为,在更好地理解语言之间的差异方面,答案是相当相关和有趣的。
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;
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;