月下博客

while循环中的一个注意事项

for和while是最常用的循环控制结构。就常用场景,循环次数确定时用for比较多;如果只有退出条件,for和while的用量基本持平。

近日需要读取excel表格中的数据,退出条件为某个单元格内的内容为指定值,同时中间的一些空行需要跳过。因为读取的表格行数不确定,遍历表格使用了while循环,代码如下:

$row = 1;
while (true) {
    $cellValue1 = getCellValue();
    if ($cellValue1 === '') {
        continue;
    }

    $cellValue2 = getCellValue();
    if ($cellValue2 === 'xxx') {
        break;
    }

    ++ $row;
}

上述代码有一个坑:跳过空行的时候会陷入死循环。原因在于continue前没有自增$row的值,所以下次还会读取到同一行,然后又判断为空,如此继续。要让程序按预期运行,在所有break前面都应该加上 ++ $row。

这个事让我注意到了for循环的便利性。for循环的第三个语句总是会执行,所以continue前无需自增;如果continue的地方多,那么每个地方都需要自增变量,就会让代码变得啰嗦且不可维护。在这种情形下,for循环是比while循环更好的选择。

如果坚持使用while循环,在每个continue语句时需要注意类似上述的问题。