Delphi 德尔福是否有一些;“快速”;接线员?(+;=,-=,…)

Delphi 德尔福是否有一些;“快速”;接线员?(+;=,-=,…),delphi,operators,Delphi,Operators,这个问题很简单,但我在谷歌上找不到答案 在delphi中,是否有缩短此类代码的方法: MyVar := MyVar + X; 就像C++一样,我会做MyVar += x;考虑到它是多么的琐碎和有用,一定有办法,但我在任何地方都找不到任何选择 感谢您的帮助您可以使用如下命令: Inc(MyVar, X); 我担心不会变短。像+=和-=这样的“Do和Assign”操作符不是Delphi规范语言的一部分-您需要以另一种可能更长的方式进行递增。不,您没有。但是你可以使用 procedure Inc(

这个问题很简单,但我在谷歌上找不到答案

在delphi中,是否有缩短此类代码的方法:

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.

您是在寻找“快速”运算符还是短运算符IncDec在功能和长度上与+=-=最接近,但在某些情况下它们也更快。如果启用了范围检查,则它们比调用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规范中没有任何内容。罗布·肯尼迪注意到并修正了这一点。