gpt4 book ai didi

C++:使用 goto 加速 for 循环?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:04:37 28 4
gpt4 key购买 nike

在下面的 for 循环中,如果 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
}
}

或者用德摩根定律得到 !conditionA() || !conditionB() || !conditionC - 无论你喜欢哪个。

关于C++:使用 goto 加速 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383448/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com