在下面的for
-loop中,如果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
}
}
或使用De Morgan定律获取
!conditionA() || !conditionB() || !conditionC
-随便哪个。