Delphi - 相当于 C# 的三元运算符? [复制]

Posted

技术标签:

【中文标题】Delphi - 相当于 C# 的三元运算符? [复制]【英文标题】:Delphi - Equivalent to C#'s ternary operator? [duplicate] 【发布时间】:2011-07-11 15:35:16 【问题描述】:

可能重复:Is there, or is there ever going to be, a conditional operator in Delphi?

我知道 Delphi 没有 C# 中的三元运算符。 即?:

那么如何最好地表示这个函数调用呢?那里最干净的方法是什么?

如果有任何代码可以用来代替编写单独的函数,那会很好吗?如果不是,那么最有效和/或最简洁的代码表示形式是什么?

【问题讨论】:

不存在“the 三元运算符”。三元运算符是接受三个操作数的 any 运算符。您可能指的是特定的三元运算符,即?: 感谢 Mikael,投票结束。 @Andreas,如果只有一个三元运算符,那么它就是 the 三元运算符。我们也可以通过它的名字来称呼它,条件运算符。同样,只有一个人发表了关于这个问题的第一条评论。我们可以称他为对这个问题发表第一条评论的人,也可以直呼他的名字 Andreas。 要回答“是否会成为一部分”,我的猜测是没有,不会有。这不是“Pascal-y”。 @Rob:是的,你是对的,当然。 【参考方案1】:

最接近三元运算符的是:

if (condition) then <statement> else <statement>;

据我所知,Delphi 中没有三元运算符。

【讨论】:

对不起,有一个错字。我不记得 Delphi 中的三元运算符。【参考方案2】:

试试绝地的 IFF:

function Iff(const Condition: Boolean; const TruePart: string; const FalsePart: string): string; overload;
function Iff(const Condition: Boolean; const TruePart: Char; const FalsePart: Char): Char; overload;
function Iff(const Condition: Boolean; const TruePart: Byte; const FalsePart: Byte): Byte; overload;
function Iff(const Condition: Boolean; const TruePart: Integer; const FalsePart: Integer): Integer; overload;
function Iff(const Condition: Boolean; const TruePart: Cardinal; const FalsePart: Cardinal): Cardinal; overload;
function Iff(const Condition: Boolean; const TruePart: Float; const FalsePart: Float): Float; overload;
function Iff(const Condition: Boolean; const TruePart: Boolean; const FalsePart: Boolean): Boolean; overload;
function Iff(const Condition: Boolean; const TruePart: Pointer; const FalsePart: Pointer): Pointer; overload;
function Iff(const Condition: Boolean; const TruePart: Int64; const FalsePart: Int64): Int64; overload;
function Iff(const Condition: Boolean; const TruePart: Variant; const FalsePart: Variant): Variant; overload;

【讨论】:

是的,这是 RTL 的 IfThen 函数的“扩展”版本。但与?: 相比,它仍然存在与IfThen 函数相同的问题。 注意,除了docwiki.embarcadero.com/Libraries/Sydney/en/…,还有docwiki.embarcadero.com/Libraries/Sydney/en/System.Math.IfThen【参考方案3】:

当然可以

IfThen(SomeBooleanExpression, IfTrueReturnValue, IfFalseReturnValue)

其中返回值是数字 (uses Math) 或字符串 (uses StrUtils)。但请注意,这将在所有情况下评估两个参数 - 没有惰性评估,因此它不如 C# 中的 ?: 运算符高效,后者只评估正确的操作数。

所以你不能这样做

y := IfThen(x <> 0, 1/x, 0)

最好的就是坚持平凡

if x <> 0 then y := 1/x else y := 0;

【讨论】:

该死的希望能避开我所有的小if then elses :( 不知道是否仍然如此,但使用 IfThen 的缺点是(/是)总是评估所有部分,并且您无法像使用“正常”那样避免访问冲突" if 语句。即if Assigned(A) then X := A.DoSome else X := ''; 啊,现在看到你提到了惰性求值,但以除以零为例...... 如果两个值代替表达式(匿名函数)可以进行短路评估

以上是关于Delphi - 相当于 C# 的三元运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#中的三元运算符

LINQ 查询中使用的 C# 三元运算符

C# - Dictionary 和 Object[] 之间的三元运算符

js三元运算符与循环

相当于三元运算符的 SQL 语句

在 C# 中创建元组时编译错误,没有括号包围三元运算符