能否将依赖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
相关产品推荐
相关产品推荐

