2011-09-15 9 views
0

誰かがそれが大いに役立つと説明できるなら、このスニペットが何をするのか分かりません。このC++スニペットの問題

bool result; 
    for (std::set<_Tp>::const_iterator o = objs.begin(); o != objs.end(); o++) 
    { 
     //confusion here, what does this do 
     result |= accept(c, *o, bid); //accept returns a bool 
    } 

    return result; 
    } 

私は|=化合物演算子はビット単位を行うことを知っているか、それは結果の値のために何を意味するのでしょうか?受け入れがtrueを返す場合、resultの値はtrueのままです。

私は

おかげ

+0

本当にこの文脈では '|| ='であるべきです。 STL-ishであるこれを書く他の方法があります。 –

答えて

3

|=私は本当に|=ではなく=

であり、なぜすべてのヘルプは素晴らしいだろう理解していないと思いますが、ビット単位であるか、論理的ではありませんか。スニペットからロジックを削除しましたが、基本的には、acceptの定義が何であれ、セット内のオブジェクトが「受け入れられる」限り真を返します。

+0

ahh私は例を混乱させたくないので、他のコードを抽象化しようとしましたが、cはコントローラタイプのオブジェクトのリストです。したがって、1つのコントローラがオブジェクトの所有権を取得する限り、それは真を返します。ありがとう! –

+0

自動変数 'result'の初期値は定義されていないので、最初はtrueに設定することができます。明示的にfalseに設定したいと思うかもしれません。 –

2

x |= yは、x = x | yに相当します。だから何

result |= accept(...); 

するtrueacceptかの戻りtrueresultを設定されない - とaccept戻りfalse場合は一人でそれを残します。 ||とは対照的に

|

は、ビット単位操作が、ブール値に対しては、同じ結果を与えます。 (||=演算子はありません。おそらく||には短絡のセマンティクスがあるからです)。

すべてのコードではないことを願っています。あなたが私たちに示したコードでは、resultは初期化されていません。

+0

私は自分自身は確かではありませんでしたが、明らかに '|| ='はありません([CとC++の演算子](http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B)参照)。 – vstm

+0

@vstm:あなたは正しく、修正されています。 –

0

関数acceptからの戻り値のいずれかが真であるかどうかをチェックします。 |==に置き換えた場合、acceptの最後の呼び出しがfalseを返した場合、最終結果もfalseになります。以前の値はすべて上書きされます。代わりに|=を使用すると、以前の結果を保持することができます。