这段C++代码如何跳出for循环?

3

以下是代码:

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

我认为这个函数会遍历存储在someList中的所有someClass实例,如果get_something() == get_something_else(),那么我们将1赋值给returnBool,否则将0赋值给它,因为这是按位或运算符。
然而,在调试器中我注意到,无论someList有多长,只要returnBool为1,就会立即跳出for循环 - 这样听起来正确吗?
感谢您的时间 =]

3
可能是一个聪明的编译器在 returnBool 变为非0后优化了一个 break? - Cameron
@Cameron,这在很大程度上取决于get_something和其他操作。 - Luchian Grigore
你使用的编译器是什么?为了编译器优化而退出循环听起来很奇怪! - Sdra
2个回答

3

实际上,一旦 returnBooltrue,无论多少次使用 |= 都不会使其变为 false,因为 true | false == true

事实上,如果方法 get_something 不是变异的(根据它们的名称),第一次 returnBooltrue 时就可以安全地退出循环。


我认为这基本上是一个“any_of”检查。 - Xeo
3
即使如此,它们仍然可以是非变异的并且具有副作用。我认为依靠编译器进行这种优化是牵强附会的 - 我不指望它会这样做。 - Luchian Grigore
@Luchian:从严谨的角度来看,const是否有区别取决于returnBool是方法中的局部变量还是类成员。如果它是局部变量,则在第一个true时中断循环的优化始终适用。 - FrankH.
@FrankH. 不是真的。如果 get_something 在屏幕上打印了什么怎么办? - Luchian Grigore
@LuchianGrigore:抱歉,我的评论本意是说你是对的,但我表达得不好。 - Gorpik
显示剩余7条评论

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接