You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将依赖getFooAtIndex的while循环改写为紧凑for循环?

问题与解决方案

问题描述

我有如下一段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向量再遍历的方式。补充说明:getFooAtIndex是第三方API,只能通过索引获取Foo,无法预知Foo的总数;要求改写后的for循环支持在任意位置调用continue,且能正确遍历所有Foo直到getFooAtIndex返回空值。

C语言实现

完全可以改写为紧凑的for循环,核心是把变量初始化、条件判断和迭代逻辑整合到for循环的三个表达式中,同时保证continue能正确推进循环:

C99及以上标准写法

for (int index = 0; Foo foo = getFooAtIndex(index); index++) {
    // do stuff with foo
    // 调用continue会自动执行index++,然后获取下一个foo进行判断
}

说明:C99允许在for循环的初始化部分声明变量,让代码更紧凑,变量作用域仅限于循环内部。

C89兼容写法

如果需要兼容C89标准(不支持在for初始化段声明变量),可以提前声明变量:

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

这种写法将foo的赋值和条件判断合并到for的条件表达式中,每次循环都会先获取当前索引对应的Foo,判断不为空则执行循环体,循环结束(包括continue触发的结束)时自动执行index++,完全匹配原while循环的逻辑。

C++实现

C++可以沿用类似C的写法,同时支持更简洁的语法:

基础写法

for (int index = 0; Foo foo = getFooAtIndex(index); ++index) {
    // do stuff with foo
    // continue同样会执行++index,然后进入下一次Foo获取与判断
}

C++11及以上简洁写法

利用auto自动推导类型,让代码更简洁:

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

内容的提问来源于stack exchange,提问作者Bri Bri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:00:15