Delphi 德尔福是否有一些;“快速”;接线员?(+;=,-=,…)
这个问题很简单,但我在谷歌上找不到答案 在delphi中,是否有缩短此类代码的方法:Delphi 德尔福是否有一些;“快速”;接线员?(+;=,-=,…),delphi,operators,Delphi,Operators,这个问题很简单,但我在谷歌上找不到答案 在delphi中,是否有缩短此类代码的方法: MyVar := MyVar + X; 就像C++一样,我会做MyVar += x;考虑到它是多么的琐碎和有用,一定有办法,但我在任何地方都找不到任何选择 感谢您的帮助您可以使用如下命令: Inc(MyVar, X); 我担心不会变短。像+=和-=这样的“Do和Assign”操作符不是Delphi规范语言的一部分-您需要以另一种可能更长的方式进行递增。不,您没有。但是你可以使用 procedure Inc(
MyVar := MyVar + X;
就像C++一样,我会做MyVar += x;考虑到它是多么的琐碎和有用,一定有办法,但我在任何地方都找不到任何选择
感谢您的帮助您可以使用如下命令:Inc(MyVar, X);
我担心不会变短。像
+=
和-=
这样的“Do和Assign”操作符不是Delphi规范语言的一部分-您需要以另一种可能更长的方式进行递增。不,您没有。但是你可以使用
procedure Inc(var X [ ; N: longint ] );
Inc(avar)
Inc(avar, 10)
将变量增加N,或
procedure Dec(var X [ ; N: longint ] );
Dec(avar);
Dec(avar, 10);
要将变量递减N.您是在寻找“快速”运算符还是短运算符Inc和Dec在功能和长度上与+=和-=最接近,但在某些情况下它们也更快。如果启用了范围检查,则它们比调用x:=x+1更快强>
这里是启用范围检查的反汇编,其中所有变量都是Inc(MyVar,x)
// Inc(MyVar, x);
add bl, x
这里是x:=x+1
// x := x + 1;
movzx eax,bl
movzx edx, x
add eax,edx
cmp eax,$000000ff
jbe success
call @BoundErr
success:
mov ebx,eax
即使没有范围检查失败,也可以看到差异
但是,如果启用溢出检查,Inc仍然会受到该开销的影响
在delphi中,是否有缩短此类代码的方法:
MyVar := MyVar + X;
你想缩短什么?x=x+1和x+=1以支持它们的语言(对于标准类型)生成相同的代码。由于Delphi没有运算符重载,因此x:=x+1是一个整数或浮点运算。代码语法就是:语法。一个不是比另一个“更快”。移除那个不必要的空间会使它变短。这个空间可能不是语言语法所必需的,但我认为它是可读性的必要条件:-当<代码> x <代码>是一个表达式(可能有副作用,但即使是昂贵的属性也会这样做);在支持它的语言中,
x=x+1
和x+=1
之间肯定存在巨大的差异。无论如何,Delphi不是这些语言中的一种。Pavel,即使在支持Delphi的语言中,也没有什么不同。读取和写入属性涉及完全独立的函数,两种函数必须在任一语法中执行一次。当您有一个类似于e.x:=e.x+1
的复合表达式时,就会出现差异,其中表达式e
的计算代价很高。在这种情况下,简写就起作用了。当我提到属性时,我指的是foo.bar.baz+=1
,其中bar
是一个昂贵的属性获取工具(而baz
可能只是一个字段)。当然,baz
可以是一个“标准类型”,它不会改变任何东西。如果bar是一个昂贵的属性,并且经常递增,那么foo的类应该提供一个方法来递增,因为foo的类可能根本不需要调用getter。Delphi规范中没有任何内容。罗布·肯尼迪注意到并修正了这一点。