2011-01-24 19 views
5

多くの箇所を読み込んでいますが、条件文で指定された動作を実際に理解できません。条件文のコンマ演算子

私は代入において、第1オペランドを評価し、結果を破棄し、次に第2オペランドを評価することを理解します。

しかし、このコードでは、どうするのですか?

CPartFile* partfile = (CPartFile*)lParam; 
ASSERT(partfile != NULL); 
bool bDeleted = false; 
if (partfile,bDeleted) 
    partfile->PerformFileCompleteEnd(wParam); 

IF内のパートファイルは不要な引数ですか、それとも意味がありますか?

+0

おそらく、これが役立ちます。http://stackoverflow.com/questions/54142/c-comma-operator –

+0

一つの可能​​性がありますコーダーは 'if(partfile && bDeleted)'を意味し、他のいくつかのプログラミング言語は '' aとb ''を意味する '' IF a、b''を持っています。 –

答えて

9

この場合、不要な式であり、コードの意味を変えずに削除することができます。

+3

カンマ演算子はオーバーライド可能です。使用していると、左手の表現の状態が変わることがあります。 – Benoit

+0

@Benoit 2つのプリミティブ型(この場合はポインタとbool)ではオーバーロードできません。少なくとも1つのオペランドはクラスタイプを持つ必要があります –

4

カンマ演算子は、最初の項目の式を実行し、結果を破棄し、その結果を最後の式として評価します。

のでpartfile,bDeletedpartfileが、その後、その結果を破棄評価し、bDeleted

あなたは(メソッドを呼び出すと、例えば)副作用を持っているものを評価する必要がある場合に便利です戻ってくるものは何でもevaulateでしょう。しかし、この場合は役に立たない。詳細について

Wikipedia: Comma operator

+0

コンマ演算子はn-1個のアイテムを評価しません。 C/C++のすべての演算子は、単項またはバイナリのいずれかです。複数のコンマ演算子を1行に配置すると、最初の項目を評価し、破棄し、2番目の項目を評価し、2番目の項目をその行の次のカンマ演算子のオペランドに使用します。もちろん、結果はn-1個のアイテムを評価した場合と同じになりますが、理由を理解するために、最後のアイテムに到達するために何が起こっているのかを知る必要があります。 – Lundin

+0

良い点、私はa、b、cが1つの言葉であると考えていましたが(正しい言い方ですか?)、そこには2つのカンマ演算子があるので、そうではありません。 fixed post – helloworld922

1

partfileが評価される参照し、次にbDeleted試験として評価されて使用されます。 partfileの評価には副作用がないため、条件文から削除することは効果がありません。ここで

+0

あなたはそれを後方に持ち、partfileが評価され無視され、bDeletedが評価されて返されます。 – helloworld922

+0

@ helloworld922:本当に、修正されます。 – ThomasMcLeod

2
bool bDeleted = false; 
if (partfile,bDeleted) 
    partfile->PerformFileCompleteEnd(wParam); 

は、if文はpartfile、bDeletedを評価しますが、式は実行に失敗したのでBDELETEは、常にfalseです。重要な問題は、「それは何のことなの?可能性としては、誰かが一時的にpartfile->PerformFileCompleteEnd(wParam);文が実行されないようにしたいと思っていたことが考えられます。これはおそらく何らかの問題を引き起こしていたか、彼らは以前の "if(partfile)"ロジックを残していたが、partfile->Perform...ロジックが効果的にプログラムから "削除"されたことを文書化するためにハードコーディングされたbDeleted変数を追加した。

一時的にそのようなコードを無効にする良い方法は、時々私も推論を文書化しようとするのに... ... ...おそらく

#if 0 
    if (partfile) 
     partfile->PerformFileCompleteEnd(wParam); 
#endif 

ある

#ifndef DONT_BYPASS_FILE_COMPLETE_PROCESSING_DURING_DEBUGGING 
    if (partfile) 
     partfile->PerformFileCompleteEnd(wParam); 
#endif 

...か...

if (partFile, !"FIXME remove this after debugging") 
    partfile->PerformFileCompleteEnd(wParam); 

最良の選択は、あなたのツールセットと既存の習慣に依存します(例えば、いくつかのエディタのハイライト「FIXME」と「TODO」逆のビデオでは、#if 0ブロックを見逃したりグレーアウトしたりするのは難しいです。ソース制御チェックインが警告する特定の文字列があるかもしれません。プリプロセッサは、デバッグとリリースビルドでのみ定義され、偶発的な配布などを防ぐことができます)。

1

カンマ演算子は、C/C++の機能があいまいです。これは、リストを初期化する際のカンマ(int x、int y;)や関数呼び出しのパラメータ分離カンマ(すなわち:func(x、y))と混同してはいけません。

カンマ演算子には、プログラマに式の評価順序を与えるという単一の目的があります。 C/C++のほとんどの演算子では、式の評価順序は未定義です。私が書く場合

結果= x + y;

ここで、xとyは部分式で、xまたはyのいずれかが最初に評価されます。どのコンパイラかが分かりません。しかし、あなたが書く場合

結果= x、y;

評価の順序は、標準によって保証されています。もちろん、実際のアプリケーションではこれの用途は非常に限られている

...