2009-08-30 14 views
7

あなたが整数を返すC関数を持っている場合、あなたはこのような文記述することができます。私たちはビット単位-AND代入演算子を使用している&=と| =の定義された評価順序がありますか?

MyInt &= MyFunc(); 

を...。

問題は:MyIntがゼロであってもMyFunc()が実行されることが保証されていますか?

ビット単位のOR代入演算子(| =)を使用すると、MyIntがすべて1に設定されていても、MyFunc()は常に実行されますか?

言い換えれば、ビット演算子のCで遅延評価が可能ですか?

答えて

1
MyInt &= MyFunc(); 

は同等です:

MyInt = MyInt & MyFunc(); 

言語&オペレータが短絡していないと述べています。しかし、 MyInt がゼロで、関数に副作用がないと確信した場合、オプティマイザは関数を呼び出さないコードを生成する可能性があります。ランタイムテストでおそらくそれが悲観的になるので、私はコンパイラが実際にこれを行うことを疑う。

+1

「MyInt」は** ** once **と評価されます(副作用のある式では問題になるかもしれません) –

+0

割り当てのLHS上のものは評価されません。 –

+0

Neil: 'myMap [" test "] | = 10;' myMap.operator [] 'が何かを出力する場所を考えてみましょう。それは2番目のフォームで2回印刷されますが、複合割り当てフォームでは1回印刷されます。 –

8

ビット単位の演算子は、短絡していません。 MyIntの値にかかわらず、MyFunc()の実行が保証されます。

関連する問題