2

在 Delphi中编写无操作语句的最佳方法是什么?

拿这个代码:

if a=b then
  SomeOldStatement
else
  AnotherStatement;

并说你暂时想rem out SomeOldStatement

你会选择这个解决方案吗:

if a=b then
  //SomeOldStatement
else
  AnotherStatement;

就我个人而言,我不喜欢空白then部分,并希望在其中有一些可编译的东西......

if a=b then
  NoOp
  //SomeOldStatement
else
  AnotherStatement;
4

7 回答 7

15

不知道为什么你需要任何东西(例如我对“然后其他”很满意)。

但是,如果您想要那里可编译的东西,我会这样做:

if a=b then
  begin end
  //SomeOldStatement
else
  AnotherStatement;

一个空的开始块是我在 Delphi 中所知道的最好的 noop。它不会产生汇编代码,因此不会产生开销。

于 2011-09-24T03:04:26.517 回答
12
if a=b then 
  SomeOldStatement 
else 
  AnotherStatement; 

应该写成

if a=b then
begin
  SomeOldStatement;
end 
else
begin
  AnotherStatement; 
end;

现在,您可以注释掉 SomeOldStatement;与您所追求的效果完全相同,调试器更准确地遵循代码流并且您避免了代码中的奇怪副作用,例如

if a=b then
  if b=c then
    statement1
  else
    if c=d then
      statement2;
  else
   statement2
else 
  statement3;

搞砸你的缩进,弄错分号,记录一行以供测试和神圣的废话,事情很快就会变得丑陋。

说真的,试着弄清楚我刚刚写的代码在没有编译器通过的情况下是否有效。

现在,猜猜这会发生什么:

if a=b then
if b=c then
statement1
else
if c=d then
statement2;
// else
statement2
else 
statement3;

还:

if a=b then
  statement1;
  statement2;

经常会做一些奇怪的事情,甚至在你做的时候也会做一些奇怪的事情

if a=b then
//  statement1;
statement2;

严肃——只要养成在所有逻辑中始终以开头结尾的习惯——它使你的代码更容易理解,避免副作用,避免心理解析错误,代码解析错误和注释掉副作用。

另外,空的开始/结束与您的无操作相同。

于 2011-09-24T05:58:18.690 回答
6

在 Delphi 2005 及后续版本中,您可以定义一个NoOp空过程并将其标记为inline.

这样,除非您在Compiler Options{$INLINE OFF}中定义或设置Code inlining controlOff ,否则不会生成任何代码。

procedure NoOp; inline;
begin
  // do nothing
end;

生成的代码非常干净:

if a=b then
  NoOp //SomeOldStatement
else
  AnotherStatement;
于 2011-09-24T16:40:28.103 回答
4

那是最好的选择。我将它广泛用于调试,因为我可以在那里放置断点,不依赖于另一个单元,不会以任何方式干扰您的程序,并且比条件断点快得多。

if a=b then
  asm nop end
else
  AnotherStatement;
于 2016-07-08T00:16:08.003 回答
3

你可以使用类似的东西,a:=a但是,老实说,我发现它比非陈述更难看- 你应该编码,以便那些在你之后的人会理解你的意图,并且命令a:=a并没有真正遵循该准则。

由于这只是暂时的事情,我会认为你没有可执行代码。如果,如您所说,Delphi 仍然可以很好地编译它,那么您没有问题。

如果你想要一些代码作为断点,并且没有更好的方法,我会考虑暂时做这a:=a件事。

如果这将是一个更永久的更改,您可以考虑反转条件,以便您根本没有空块:

if not (a = b) then
    AnotherStatement;

或者,更好的是:

if a <> b then
    AnotherStatement;
于 2011-09-24T02:03:35.300 回答
2

怎么分配,a := a?那是无操作。

(我不知道 Delphi,所以分配的语法可能是错误的,但希望你能理解并在需要时更正语法)

于 2011-09-24T02:00:46.703 回答
1

如果没有块的语句begin end是一个等待发生的错误,在这种情况下添加一个begin end块将允许您注释掉您的行而无需更改任何更多代码。

于 2011-09-25T08:43:40.947 回答