Delphi 中的一元++运算符

rqcrx0a6  于 2023-03-22  发布在  其他
关注(0)|答案(3)|浏览(135)

我怀疑答案是否定的,但是是否有任何等价于C一元前缀和后缀递增运算符“”的东西。

int test = 1;
SomeFunc(test++);    // test is 1 inside SomeFunc and 2 afterwards
test = 1;
Somefunc(++test);    // test is 2 inside SomeFunc and 2 afterwards

我知道 Delphi 中的Inc(和Dec)运算符,但你不能像这样将它传递给函数:

test: Integer;
//...
SomeFunc(Inc(test));   // compiler error, incompatible types

除了编译错误之外,似乎没有不同的前缀和后缀增量。编写这样的代码并不是一个大问题:

SomeFunc(test);
test := (test + 1);
SomeFunc(test);

但是C中的(和--)运算符是一个很棒的特性。

tpxzln5u

tpxzln5u1#

Delphi 中没有内置的等效功能。
你可以考虑像这样写函数:

function PostInc(var Value: Integer): Integer;
begin
  Result := Value;
  inc(Value);
end;

function PreInc(var Value: Integer): Integer;
begin
  inc(Value);
  Result := Value;
end;

您可能希望将任何此类函数内联。尽管对于此类函数的有用程度还有待讨论。
我个人认为这些运算符在C和C++中有时候很方便,但它们的情况并不是压倒性的。当然,对于初学者来说,它们是一个巨大的陷阱,可以从这里询问++i++ + i++等表达式的源源不断的问题中看出。
FWIW,你对操作员的描述是不精确的。你说:

int test = 1;
SomeFunc(test++);    // test is 1 inside SomeFunc and 2 afterwards

这是不正确的。变量test在调用SomeFunc之前递增,因为函数调用是一个序列点。因此,如果从SomeFunc内部观察,test具有值2。但是传递给SomeFunc的值是1。此程序:

#include <iostream>

int test = 1;

void foo(int x)
{
    std::cout << x << std::endl;
    std::cout << test << std::endl;
}

int main()
{
    foo(test++);
}

产出

1
2
qnzebej0

qnzebej02#

如果你只是想把递增的值传递给函数,你可以使用Succ,也就是SomeFunc(Succ(Test));,但是之后Test不会递增。

gkn4icbw

gkn4icbw3#

如果你想在 Delphi 或Pascal中使用函数,你可以使用以下代码:

function inc(Var TmpInt: Integer):Integer; overload;
begin
  TmpInt := TmpInt+1;
  result := TmpInt;
end;

相关问题