我一直在努力编写尽可能少的代码。 所以,我用:
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;
谢谢。
答案 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;
唯一真正的缺点是您丢失了类型检查。编译器不会阻止您传递非整数类型的地址。这可能会导致其他结构的破坏。数据或访问违规。