2012-01-19 7 views
1

以下の2つのコードスニペットはまったく同じことをしていますか?whileループの状態は

do 
{ 
    Delay_us(1); 
    status = fetchStatus(); 
}while(!status); 

第snipet - >

do 
{ 
    Delay_us(1); 
}while(status = fetchStatus(), !status); 

好ましいですか?

+1

秒1は恐ろしいされていること。最初のものに代わるものは現実的に 'while(!(status = fetchStatus())'です。 –

+1

2番目のコードは正当なものですか?ループの条件は有効な式である必要はありませんか? – prelic

+0

@prelic:私の知る限りでは、混乱の原因となるわかりにくい機能が使用されています:http://en.wikipedia.org/wiki/Comma_o​​perator –

答えて

4

はい、彼らは同じことを行うが、私は次のことを好むだろう:

do { 
    Delay_us(1); 
} while (!(status = fetchStatus())); 

それは1文ではなく、二つにすべて一緒にそれを合理化したよう。

あなたが行うことができます
+1

?これは呼び出しの数を減らしません。 –

+0

@StephenCanon私が言い訳をすると、それを指摘してくれてありがとうございます。 –

7

do 
{ 
    Delay_us(1); 
} while(!fetchStatus()); 

あなたは、あなたがそれを使用しないでください場合、ローカル変数を作成する必要はありませんこの方法。

+1

彼はそれを使用していないことをどのように知っていますか? – asaelr

+1

私はそれを使用します;)THanks – Christian

+0

@asaelr OPがそれを使用しているかどうかわかりません、私はOPから逃げ出しています。 – Neal

1

これらは同じ論理出力を持ちます。どちらの場合もステータスは割り当てられて評価されますが、最初のものははるかに読みやすくなります。一般的にカンマ演算子は使用しないでください。

0

私は専門家ではありませんが、私たちはコンパイラ最適化の領域に入っていると考えています。実際には、そのコードからバイナリを生成するために使用するコンパイラに依存します。あるコンパイラがあなたの最初のスニペットのようなコードをとり、それを2番目のスニペットが行うバイナリコードに最適化することができます。

1

これらは同等です。それらは同等であるためどちらも好まれません。しかし、それはもっとよく知られているので、最初の方が審美的に好きかもしれない人もいます。

ステータスの最初の確認の前に実際に遅延するつもりはありますか?

0

方法について:

for(; !fetchStatus(); Delay_us(1)); 
関連する問題