在下面的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
}
Run Code Online (Sandbox Code Playgroud)
如果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
}
Run Code Online (Sandbox Code Playgroud)
现在这看起来很丑陋,乍看之下并不明白.似乎使用臭名昭着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
}
Run Code Online (Sandbox Code Playgroud)
这是否可以作为加速循环的方法,或者编译器是否足够智能,以至于第一个版本的代码实际上和第二个和第三个版本一样快?如果不是,是否有比使用更好的选择goto?
Jos*_*eld 21
我会将条件的评估转移到单独的函数中,然后执行:
for (int i = 0; i < imax; ++i) {
if (conditionA() && conditionB() && conditionC()) continue;
// do something
}
Run Code Online (Sandbox Code Playgroud)
如果conditionA返回false,conditionB将永远不会被调用,依此类推.
这也将使您的功能更短,更简洁,将职责分配到其他功能中.
如果你没有充分的理由像这样做"提前退出",你可以continue完全避免使用:
for (int i = 0; i < imax; ++i) {
if (!(conditionA() && conditionB() && conditionC())) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用De Morgan定律!conditionA() || !conditionB() || !conditionC- 无论您喜欢哪种方式.