是否可以将语句转换为表达式?

时间:2016-06-20 21:56:46

标签: delphi pascal lazarus freepascal turbo-pascal

在C中,您可以使用

在一行中分配两个变量
b = a = sqrt(10);

在Delphi中

b := a := Sqrt(10);

是不允许的。

使用IfThen,有一个"替代品"对ternary operator ?:中讨论的Delphi - Equivalent to C#'s ternary operator?进行了总结,IfThen似乎绝对是必要的。

所以也许还有这样的事情:

function AssignAndReturn(var LHS: Integer; RHS: Integer): Integer;
begin
  LHS := RHS;
  Result := RHS;
end;

(...)

var
  a, b: Integer;
begin
  b := AssignAndReturn(a, Round(Sqrt(10)));

我并没有试图让一切看起来像C"。我刚刚注意到,有时候重用"会很好。再次在同一行中分配的右侧。 (例如,请参阅Lazarus/Free Pascal: How to improve coding style (to avoid using endless loop) of a while loop whose boolean expression is reassigned every pass。)

2 个答案:

答案 0 :(得分:9)

赋值语句不是表达式。它不会,也绝不会产生价值。在一个语句中分配多个变量的唯一方法是通过一个函数。

基于这个问题和你之前的问题,我会说你在试图与语言作斗争时是错误的。编码您正在使用的语言。在C中你可以写

b = a = sqrt(10);

但是在Pascal中,语言希望你像这样写它

a := sqrt(10);
b := a;

这样做。不要只是创建晦涩的函数,这样你就可以将它们全部塞进一行。上面的两行不能更清楚地阅读。停止尝试强制其他语言进入Pascal。他们不合适。

答案 1 :(得分:2)

简短的回答是:
不,你想要什么是不可能的。并且可以说在Delphi中几乎没有什么好处。

首先,让我们讨论一个更实际的例子。坦率地说,a = b = f(x);是一个相当糟糕的例子。

  • 您很少想要将相同的值分配给2个变量。
  • 上面的操作顺序必须打破从左到右的约定,否则它将首先解析a = b然后? = f(x)
  • 因此,b = f(x); a = b;
  • 赞成这一点的理由不多。
  • 基本上它对字节数(代码高尔夫)不可读。

相反,让我们考虑以下更实际的情况:

//Option 1
if ((b = f(x)) > 42)
  //use b

没有与上述相同的Delphi,但它至少可以写作可读/可维护:

//Option 2
b := f(x);
if (b > 42) then
  //use b

还有另一种选择;特别是如果选项1位于更大功能的中间。 请记住,小型函数更易于维护且更易于编译器优化。所以考虑一下:

//Option 3
...
ProcessRule42(f(x));
...
//Where Rule42 is is implemented as:
procedure ProcessRule42(b: Integer);
begin
  if (b > 42) then
    //use b
end;
由于无法写作,德尔福似乎并没有真正受苦:if (b := f(x)) > 42 then //use b

选项1是否有任何实际好处?

如果选项2至少同样好,为什么人们会对选项1感到烦恼。当您考虑范围规则时,可以看到这种好处。

//b does not exist
if ((var b = f(x)) > 42) {
  //use b
}
//b does not exist 

// Using the Delphi approach, this becomes:
//b does not exist
var b = f(x);
if (b > 42) {
  //use b
}
//b still exists

Delphi根本没有相同的范围问题 。 Delphi变量都在方法的开头声明,并且可用于整个方法。

结论

这让我们回到其他人试图解释的内容。 Delphi是一种不同的语言,对某些问题的处理方法略有不同。虽然我赞赏你研究其他选项,并考虑可以从其他语言中借用哪些概念:小心尝试强加一些他们不属于的概念。

如果你破坏了太多的Delphi范例,那么 Delphi程序员 维护代码可能会变得不必要。