2012-01-26 24 views
7

のbooleanのために私はC++で次のような構成につまずきましたTryAndDoSomethingへの呼び出しのうち少なくとも1つがtrueを返していました。演算子は= C++

しかし、今では複数の呼び出しが実際にtrueを返すことができるかどうかは疑問です。私たちは通りの動作を拡張する場合は確かに:

result = result || TryAndDoSomething(i); 

他の呼び出しが前trueを返さない場合、リターンはfalseに評価されている場合にのみメソッドが呼び出されます、それは、あります。したがって、1つの呼び出しがtrueを返すと、他の呼び出しは行われません。

これは正しい解釈ですか?

+1

簡単にテストできます。私はちょうどした、そして、すべての呼び出しが行われたように見える、最初のだけではない。 –

答えて

7

ブール値では、|||と同じ結果をもたらしますが、短絡しません。 |=の右オペランドは常に評価されます。

+0

@MooingDuck:この質問はブーリアンについてのみ質問します。私はOPがbitwise-ORを知っているかどうかは分かりませんし、彼がやっていることには重要ではないようです。 –

+0

IDは、OPが明らかにbitwise-or(修正された入力ミス)について知りませんので、非ブール値がどのように異なっていたかを答えたら、幸いです。 –

13

ビット単位のOR割り当てであり、短絡OR評価ではありません。これは、と等価である:

result = result | TryAndDoSomething(i); 

ない

result = result || TryAndDoSomething(i); 
2

x |= f()(ビット単位OR)とx = x || f()(論理和)との間のこの文脈における唯一の違いは、後者が短絡であることです。前者の場合、f()は実行されます回 - もちろんf()が例外をスローしない限り、それは別の話です。

||バージョンでは、がtrueになると、f()はもう呼び出されなくなります。 C++には||=演算子がありませんが、|=||=(存在する場合)はこれにより異なるセマンティクスを持つことを理解することが重要です。 |=は、紛失した||=の代わりになるだけではありません。あなたがboolを使用して提供される側の注意点として、

標準はtruefalseはそれぞれ、整数10に変換することを指定するので、ビット演算は、安全です。したがって、この場合の唯一の違いは、遅延評価と怠惰評価です。

+0

@MooingDuck:True。 OPのコンテキストに制限するために編集されました。 –

+0

あなたが彼に言わなければならないのは、彼の解釈が無効であることだけです。 | =は、あなたが指摘しているようにビットごとのORです。したがって、x | = 1はx = x |と同じです。 1.X || = 1;コンパイルされません。 –

+0

@Ramhound:もう一度質問を読んでください。 –

0

result |= Try()result = result | Try();の略です。 ||演算子は理解しているようですが、|演算子はかなり異なっています。それはビット単位であるか(論理的ではなく)。これは、オペランドの各ビットa=a||bを実行した場合と同じ影響を持ち、論理的および/または論理的な救済策を持っていません。 (それはまた、クレイジー高速です;追加より速くまたは速く)。他のビット演算は、&(ビットごとに:a=a&&b、各ビットには^(各ビットにビット単位でxor:a=(a!=b))です。

+0

@BenVoigt:コピー&ペーストFTL!ありがとう!修正されました。 –