在下面的 for
循环中,如果 conditionA
、conditionB
和 conditionC
,我什么都不做> 所有评估为 true
。
for (int i = 0; i < imax; ++i) {
bool conditionA;
// evaluate conditionA
bool conditionB;
// evaluate conditionB
bool conditionC;
// evaluate conditionC
if (conditionA && conditionB && conditionC) continue;
// do something
}
如果 conditonA
的计算结果为 false
,则无需计算 conditionB
和 conditionC
。所以看起来我可以通过下面的方式来写来加速循环。
for (int i = 0; i < imax; ++i) {
bool conditionA;
// evaluate conditionA
if (conditionA) {
bool conditionB;
// evaluate conditionB
if (conditionB) {
bool conditionC;
// evaluate conditionC
if (conditionC) continue;
}
}
// do something
}
现在这个看起来很难看,第一眼看不懂。似乎使用臭名昭著的 goto
代码变得更加优雅:
for (int i = 0; i < imax; ++i) {
bool conditionA;
// evaluate conditionA
if (!conditionA) goto doSomething;
bool conditionB;
// evaluate conditionB
if (!conditionB) goto doSomething;
bool conditionC;
// evaluate conditionC
if (conditionC) continue;
doSomething:
// do something
}
这是一种加速循环的方法,还是编译器足够聪明以至于代码的第一个版本实际上与第二个和第三个版本一样快?如果不是,是否有比使用 goto
更好的替代方法?
最佳答案
我会将条件的评估移动到单独的函数中,然后执行:
for (int i = 0; i < imax; ++i) {
if (conditionA() && conditionB() && conditionC()) continue;
// do something
}
如果 conditionA
返回 false
,则永远不会调用 conditionB
,依此类推。
这也会使您的功能更短、更简洁,将职责划分给其他功能。
如果你没有充分的理由像这样“提前退出”,你可以完全避免使用continue
:
for (int i = 0; i < imax; ++i) {
if (!(conditionA() && conditionB() && conditionC())) {
// do something
}
}
或者用德摩根定律得到 !conditionA() || !conditionB() || !conditionC
- 无论你喜欢哪个。
关于C++:使用 goto 加速 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383448/