如何在 Pascal 中定义运算符
How to define operator in pascal
在我的程序中,我需要在代码中经常获取百分比。现在我有这个功能来解决它
function percent(whole, part: double):double;
begin
percent:= whole * part / 100;
end;
我想知道有没有什么方法可以创建新的运算符,这样我就可以只写类似:a:=100%20 的内容,并获得想要的结果。它也应该能够用作:c:=b/a;或者:c:=c/a;
没有办法做到这一点。您只能使用函数
您可以在 Pascal 中定义运算符,但仅限于记录类型。它被称为运算符重载,您可以阅读here。您所做的是定义您自己的记录类型数据,然后重载标准运算符,例如 = < > % 等来执行您希望它们执行的操作。这是一个简单的例子:
Interface
Type
TMyFloatType = record
value: Extended;
class operator Implicit(n: Extended): TMyFloatType;
class operator Explicit(n: Extended): TMyFloatType;
class operator Equal(a, b: TMyFloatType): Boolean;
class operator GreaterThan(a, b: TMyFloatType): Boolean;
end;
Implementation
class operator TMyFloatType.Implicit(n: Extended): TMyFloatType;
begin
result.value := n;
end;
class operator TMyFloatType.Explicit(n: Extended): TMyFloatType;
begin
result.value := n;
end;
class operator TMyFloatType.Equal(a, b: TMyFloatType): Boolean;
begin
result := (a.value = b.value);
end;
class operator TMyFloatType.GreaterThan(a, b: TMyFloatType): Boolean;
begin
result := (a.value > b.value);
end;
然后您可以像使用常规变量一样使用它:
procedure Test;
var
a, b: TMyFloatType;
Begin
// first assign some values to a and b
a := 3.14;
b := 2.7;
if a > b then
Begin
// Do something
End;
End;
您可以重载的运算符也包括数学运算符,例如 + - / * mod div
等。
现在,话虽如此,我确实相信为了避免简单的功能而实际实现它并不是很方便,但是嘿,你的选择。
这里的要点是您可以让操作员过载来执行您的命令。我相信要进行像 percentage := a % 20;
这样的计算,您需要重载模数运算符。
我只会使用一个函数。顺便说一下,你的函数
函数百分比(整体,部分:双):双;
开始
百分比:=整体*部分/100;
结束;
不正确。应该是
百分比 := 100.0 * 部分/全部;
在我的程序中,我需要在代码中经常获取百分比。现在我有这个功能来解决它
function percent(whole, part: double):double;
begin
percent:= whole * part / 100;
end;
我想知道有没有什么方法可以创建新的运算符,这样我就可以只写类似:a:=100%20 的内容,并获得想要的结果。它也应该能够用作:c:=b/a;或者:c:=c/a;
没有办法做到这一点。您只能使用函数
您可以在 Pascal 中定义运算符,但仅限于记录类型。它被称为运算符重载,您可以阅读here。您所做的是定义您自己的记录类型数据,然后重载标准运算符,例如 = < > % 等来执行您希望它们执行的操作。这是一个简单的例子:
Interface
Type
TMyFloatType = record
value: Extended;
class operator Implicit(n: Extended): TMyFloatType;
class operator Explicit(n: Extended): TMyFloatType;
class operator Equal(a, b: TMyFloatType): Boolean;
class operator GreaterThan(a, b: TMyFloatType): Boolean;
end;
Implementation
class operator TMyFloatType.Implicit(n: Extended): TMyFloatType;
begin
result.value := n;
end;
class operator TMyFloatType.Explicit(n: Extended): TMyFloatType;
begin
result.value := n;
end;
class operator TMyFloatType.Equal(a, b: TMyFloatType): Boolean;
begin
result := (a.value = b.value);
end;
class operator TMyFloatType.GreaterThan(a, b: TMyFloatType): Boolean;
begin
result := (a.value > b.value);
end;
然后您可以像使用常规变量一样使用它:
procedure Test;
var
a, b: TMyFloatType;
Begin
// first assign some values to a and b
a := 3.14;
b := 2.7;
if a > b then
Begin
// Do something
End;
End;
您可以重载的运算符也包括数学运算符,例如 + - / * mod div
等。
现在,话虽如此,我确实相信为了避免简单的功能而实际实现它并不是很方便,但是嘿,你的选择。
这里的要点是您可以让操作员过载来执行您的命令。我相信要进行像 percentage := a % 20;
这样的计算,您需要重载模数运算符。
我只会使用一个函数。顺便说一下,你的函数
函数百分比(整体,部分:双):双; 开始 百分比:=整体*部分/100; 结束;
不正确。应该是
百分比 := 100.0 * 部分/全部;