3

コードは次のとおりです。

for (int i=0;i<someClass::someList.entries();i++)
    returnBool |= (someOtherClass.get_something() == 
                  ((someClass*)(someClass::someList[i]))->get_something_else());

私が思うに、すべてのインスタンス、つまりsomeListに保持されているsomeClassのptrを反復処理します。get_something() == get_something_else() の場合、値 1 を returnBool に割り当てます。それ以外の場合は、ビットごとの OR 演算子として 0 を割り当てます。

しかし、デバッガーで私が気づいているのは、 someList の長さに関係なく、 returnBool が 1 になるとすぐに for ループから抜け出しているということです-それは正しいですか?

お時間をいただきありがとうございます=]

4

2 に答える 2

3

実は、そうなるとすぐにreturnBooltrueの量が|=出ないfalseからtrue | false == trueです。

returnBool実際には、最初は安全にループから抜け出すことができますtrue(メソッドget_somethingが変化している場合を除きますが、名前では変化していません)。

于 2012-10-25T14:44:40.990 に答える
0

おそらくコンパイラの最適化です。これらの関数は、副作用がないことを確認できるほど単純だったと思います。

それらをスキップできると確信している場合は、この最適化をより目に見えるようにし、他のあまり賢くないコンパイラー (または人間) に必須にすることをお勧めします。

for (int i=0;i<someClass::someList.entries() && !returnBool;i++)
    returnBool |= (someOtherClass.get_something() == 
                  ((someClass*)(someClass::someList[i]))->get_something_else());

または、コンパイラが間違っていた (可能性は低い) 場合、またはリスト全体をテストすることを明確にしたい場合は、次のようにします。

for (int i=0;i<someClass::someList.entries();i++)
    returnInt += (someOtherClass.get_something() == 
                  ((someClass*)(someClass::someList[i]))->get_something_else());
return returnInt > 0;
于 2012-10-25T16:18:37.093 に答える