do-while 循环
do-while 循环是后置条件判断的循环结构,先执行循环体,再判断条件。这意味着循环体至少执行一次。它适合那些需要先执行操作、再根据结果决定是否继续的场景,如菜单选择、用户输入验证等。
基本语法
do
语句
while (表达式);
/* 或 */
do {
语句1;
语句2;
} while (表达式);
注意:while 后面必须有分号 ;。
int i = 0;
do {
printf("%d ", i);
i++;
} while (i < 5);
/* 输出:0 1 2 3 4 */
至少执行一次
do-while 的核心特征是循环体至少执行一次:
int i = 10;
do {
printf("%d\n", i); /* 这行会执行一次 */
i++;
} while (i < 5); /* 条件为假,循环结束 */
/* 输出:10 */
同样的逻辑用 while 实现:
int i = 10;
printf("%d\n", i); /* 先执行一次 */
i++;
while (i < 5) { /* 条件为假,不进入循环 */
printf("%d\n", i);
i++;
}
do-while 将"先执行一次"的逻辑封装在循环结构中,代码更紧凑。
典型应用场景
用户输入验证:
int choice;
do {
printf("Enter choice (1-3): ");
scanf("%d", &choice);
if (choice < 1 || choice > 3)
printf("Invalid choice. Try again.\n");
} while (choice < 1 || choice > 3);
printf("You chose %d\n", choice);
菜单循环:
int option;
do {
printf("\n--- Menu ---\n");
printf("1. Add\n");
printf("2. Delete\n");
printf("3. Exit\n");
printf("Choose: ");
scanf("%d", &option);
switch (option) {
case 1: add_item(); break;
case 2: delete_item(); break;
case 3: printf("Goodbye\n"); break;
default: printf("Invalid option\n");
}
} while (option != 3);
读取数据直到满足条件:
int value;
int sum = 0;
do {
printf("Enter a positive number (0 to stop): ");
scanf("%d", &value);
if (value > 0)
sum += value;
} while (value != 0);
printf("Sum = %d\n", sum);
与 while 的选择
| 场景 | 推荐 |
|---|---|
| 可能一次都不执行 | while |
| 至少执行一次 | do-while |
| 已知循环次数 | for |
/* while:可能不执行 */
while (has_more_data()) {
process_next();
}
/* do-while:至少执行一次 */
do {
process_next();
} while (has_more_data());
常见错误
忘记 while 后的分号:
do {
/* ... */
} while (x > 0) /* 错误:缺少分号 */
/* 正确 */
} while (x > 0);
循环体内没有更新条件变量:
do {
printf("%d\n", i);
/* 忘记 i++ → 无限循环 */
} while (i < 10);
条件永远为真:
do {
/* ... */
} while (1); /* 无限循环,需要内部 break */
/* 通常用 while(1) 或 for(;;) 更清晰 */
不必要的 do-while:
/* 不需要至少执行一次,用 while 更合适 */
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 0); /* 条件立即为假,但已经执行了一次 */
/* 用 while 更清晰 */
while (i < 0) { /* 不执行 */
/* ... */
}
最佳实践
- 只在"至少执行一次"的场景使用
do-while - 始终使用花括号包围循环体
- 不要忘记
while后的分号 - 确保循环条件最终会变为假
- 循环体内部更新条件变量
- 如果循环逻辑可以用
while表达,优先使用while(更常见、更易读)