如何更好地编写此循环?

时间:2010-07-10 13:56:32

标签: c++ loops

我有一个代码可以做这样的事情:

while (doorIsLocked()) {
    knockOnDoor();
}
openDoor();

但我想礼貌,在打开它之前总是敲门。 我可以这样写:

knockOnDoor();
while (doorIsLocked()) {
    knockOnDoor();
}
openDoor();

但我只是想知道是否有更好的成语不会重复陈述。

6 个答案:

答案 0 :(得分:43)

您可以使用do-while代替while-do循环:

do {

  knockOnDoor();

} while (doorIsLocked());

openDoor();

while-do循环不同,do-while在检查终止条件之前执行一次主体。

另见


预测试和测试后循环

do-while循环 - 有时只称为do语句 - 在C / C ++ / C#/ Java /其他一些语句中称为“后测试”循环:终止每次迭代后检查条件。它循环while条件为true,一旦false即立即终止。

Pascal有一个repeat-until循环,这也是一个“后测试”循环;它会在条件为false时循环,并在true后立即终止。

另一方面,Fortran的do-while循环是一个“预测试”循环:在
每次迭代之前检查终止条件。在C / C ++ / Java / C#/其他一些中,while-dofor循环也是“预测试”循环。

如有疑问,请务必检查语言参考。

参考

相关问题

答案 1 :(得分:5)

你在这里:

while(knockOnDoor(),doorIsLocked());

答案 2 :(得分:3)

@polygenelubricants已经发布了明显的最佳解决方案。

在某些情况下,完全从循环中删除条件可能更简单,并执行以下操作:

for (;;) {
  knockOnDoor();
  if (!doorIsLocked()) { break; }
}

因为它可以完全控制循环条件之前和之后的操作。

但是当do-while做你需要的时候,肯定更喜欢它。

答案 3 :(得分:1)

您可以进行递归调用:

void openLockedDoor(){
    knockOnDoor();
    if( doorIsLocked() ){
        return openLockedDoor();
    }
    return openDoor();
}

但上面的do-while也可以(或者甚至更好,具体取决于您的编译器。)

答案 4 :(得分:0)

你忘了等待......如果继续敲门,它也会不礼貌......所以最好的方法是这样做:

#define WAITING_TIME 2000 //2 Seconds are enough waiting time for another knock
while(doorIsLocked()){
knockOnDoor();
//Now wait
Sleep(WAITING_TIME);
}
openDoor();

答案 5 :(得分:0)

这是一个可能的解决方案

for( ; doorIsLocked(); knockDoor() )

但你也可以尝试这个

for( ; doorIsLocked();  ){
    knockDoor();
}