C语言 有没有可能重写这个使用迭代函数作为for循环的while循环?

sf6xfgos  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(159)

我有一个while循环,看起来像这样:

int index = 0;
Foo foo = getFooAtIndex(index);

while(foo != NULL_FOO_VALUE) {
    // do stuff with foo
    index++;
    foo = getFooAtIndex(index);
}

有没有什么方法可以把它重写成一个更紧凑的for循环?
C++的答案是赞赏,但我最喜欢的东西,将在C工作。所以这就排除了编写一个函数,使用这个模式来构造并返回类似Foo s的向量,然后在其上迭代。
edit:更多信息:
假设getFooAtIndex()是别人的API,我被卡住了。这是我得到Foo的唯一方法,而且必须是通过索引。我不知道我会得到多少个Foo
我所追求的那种for循环将允许我从循环中的任何地方调用continue,并且仍然使其正确工作,最终迭代每个Foo,直到getFooAtIndex()返回空值。

toiithl6

toiithl61#

我通常会看到:

Foo foo;
for (int index = 0; 
        (foo = getFooAtIndex(index)) != NULL_FOO_VALUE;
        index++) {
    // do stuff with foo
}

但是getFooAtIndex是一个糟糕的API,它通常必须遍历整个集合。最好使用和实现fooIterator或类似的接口。

for (FooIterator foo = fooBegin(); 
        foo != fooEnd();
        fooIteratorInc(&foo)) {
    Foo foo = fooIteratorGet(&get);
    // do stuff with foo
}
x3naxklr

x3naxklr2#

以下是我发现的最简洁的方法:

int index = 0;
for(Foo foo = getFooAtIndex(0); foo != NULL_FOO_VALUE; foo = getFooAtIndex(++index)) {
    // do stuff with foo. It's safe to use continue
}

这样做的一个优点是在for循环的条件中没有副作用;迭代在迭代表达式中适当地发生。
如果Foo是一个整数类型,并且它保证能够表示我们可能传递给getFooAtIndex的任何可能的索引,那么它可以在一行中完成:

for(Foo index = 0, foo = getFooAtIndex(0); foo != NULL_FOO_VALUE; foo = getFooAtIndex(++index)) {
    // do stuff with foo. It's safe to use continue
}

相关问题