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,否则将 0 作为它的按位或运算符。

但是在调试器中,我注意到的是,无论 someList 有多长,只要 returnBool 为 1,它就会跳出 for 循环 - 这听起来对吗?

谢谢你的时间=]

4

2 回答 2

3

其实,只要returnBooltrue,再多|=也做不到false,因为true | false == true

实际上,您可以安全地从第一次循环中中断returnBooltrue除非方法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 回答