2

Delphi でノーオペレーション ステートメントを作成する最良の方法は何ですか?

次のコードを使用します。

if a=b then
  SomeOldStatement
else
  AnotherStatement;

そして、一時的にレムアウトしたいと言いますSomeOldStatement

あなたはこの解決策に行きますか:

if a=b then
  //SomeOldStatement
else
  AnotherStatement;

個人的には空のthenセクションが好きではなく、そこにコンパイル可能なものを入れたいと思っています...

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

7 に答える 7

15

そこに何かが必要な理由がまったくわかりません(たとえば、「then else」に満足しています)。

しかし、そこでコンパイル可能なものが必要な場合は、次のようにします。

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

空の開始ブロックは、Delphi で私が知っている最高のヌープです。アセンブラコードは生成されないため、オーバーヘッドはありません。

于 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;

深刻です - すべてのロジックで常に開始と終了を行う習慣を身につけてください - コードを追跡しやすくし、副作用を回避し、精神的な解析エラーを回避し、コード解析エラーを回避し、副作用をコメントアウトします。

さらに、空の begin/end はノーオペレーションと同じです。

于 2011-09-24T05:58:18.690 に答える
6

NoOpDelphi 2005 以降のバージョンでは、空のプロシージャを定義して としてマークできますinline

この方法では、コンパイラ オプションでコードのインライン化コントロールを定義{$INLINE OFF}またはオフに設定しない限り、コードは生成されません。

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

結果のコードは非常にきれいです。

if a=b then
  NoOp //SomeOldStatement
else
  AnotherStatement;
于 2011-09-24T16:40:28.103 に答える
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

ブロックのない if ステートメントbegin endは発生するのを待っているバグです。この場合、begin endブロックを追加すると、コードを変更せずに行をコメントアウトできます。

于 2011-09-25T08:43:40.947 に答える