在下面的for -loop中,如果conditionAconditionBconditionC都等于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,则无需评估conditionBconditionC。因此,看来我可以通过以下方式来加快循环速度。
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-随便哪个。

08-16 21:38