我有一个代码可以做这样的事情:
while (doorIsLocked()) {
knockOnDoor();
}
openDoor();
但我想礼貌,在打开它之前总是敲门。 我可以这样写:
knockOnDoor();
while (doorIsLocked()) {
knockOnDoor();
}
openDoor();
但我只是想知道是否有更好的成语不会重复陈述。
答案 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
后立即终止。
do-while
循环是一个“预测试”循环:在每次迭代之前检查终止条件。在C / C ++ / Java / C#/其他一些中,while-do
和for
循环也是“预测试”循环。
如有疑问,请务必检查语言参考。
do-while
Statement do
do
Statement 答案 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();
}