2015-09-24 5 views
9

私は最近、真ではなく1 == 1を使用するwhileステートメントを見つけました。Whileループで1 == 1またはtrueを使用する

例:

while (1 == 1) 
{ 
    // Do something 
} 

の代わりに:

while (true) 
{ 
    // Do something 
} 

どちらが正しいと同じ結果を生成するように見えるが、私は(離れて、開発者が1 ==を使用する理由から知りたいと思いましたコンパイラの観点からはどのような影響がありますか?trueの代わりに比較演算子を使用するとオーバーヘッドが増えますか?

+5

私は、違いはないと思っています。ちょうどhabbit – Backs

+0

は、条件がチェックされるたびに「1 == 1」は余分な比較を必要としませんか?または、コンパイラはこれを最適化しますか? – mmoment

+0

while(真)またはwhile(1 == 1)の理由を見たことがない、それは私には怠惰だと思われます。ループを終了するためにfalseに設定できる実際の変数がないのはなぜですか? –

答えて

14

違いはありません。コンパイラはそれらを同じILに最適化します。

1 == 1

IL_0000: nop   
IL_0001: br.s  IL_0005 
IL_0003: nop   
IL_0004: nop   
IL_0005: ldc.i4.1  
IL_0006: stloc.0  // CS$4$0000 
IL_0007: br.s  IL_0003 

IL_0000: nop   
IL_0001: br.s  IL_0005 
IL_0003: nop   
IL_0004: nop   
IL_0005: ldc.i4.1  
IL_0006: stloc.0  // CS$4$0000 
IL_0007: br.s  IL_0003 

一つまたは他の任意の選択は、現像剤の一部に純粋文体優先です。

+2

* '1 == 1'は、あなたのステップを気にして、何か面白いことがここで起こっているのを叫ぶ。 * 'while(true)'は、コードをスキミングするときに関数呼び出し(c.f. DoStuff(true))と誤解される可能性があります。 –

+1

@ KaspervandenBerg確かに、良い自己文書化コードを書く上での優秀な点です。個人的には、どちらのケースでも、これを行うには非常に正当な理由が必要なので、大量のドキュメンテーションブロックの恩恵を受けると思います。 –

+0

ありがとう@DavidL、ILレベルで2つのステートメントを比較するのにildasmを使用することを完全に忘れました。 – Steve

関連する問題