在编程中,循环语句用于重复执行一段代码,直到满足特定条件为止。循环是解决重复性任务的核心工具,例如计算1到100的和、遍历数组、处理用户输入等。
C语言提供了三种循环结构:while循环、do-while循环和for循环。此外,break和continue语句可以更灵活地控制循环流程。
掌握循环语句,可以让你的程序更高效、简洁。
while循环是最基本的循环结构,当条件为真时重复执行循环体,直到条件变为假。
语法:
while (条件表达式) {
// 循环体语句
}
执行流程: 先判断条件,如果为真,执行循环体;执行完毕后再次判断条件,直到条件为假时退出循环。如果初始条件为假,循环体一次也不执行。
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++; // 更新循环变量,防止无限循环
}
printf("\n");
return 0;
}
#include <stdio.h>
int main() {
int sum = 0, i = 1;
while (i <= 100) {
sum += i;
i++;
}
printf("1+2+...+100 = %d\n", sum);
return 0;
}
do-while循环与while类似,区别在于它先执行一次循环体,再判断条件,因此循环体至少执行一次。
语法:
do {
// 循环体语句
} while (条件表达式); // 注意分号
#include <stdio.h>
int main() {
int i = 11;
do {
printf("i = %d\n", i);
i++;
} while (i <= 10); // 条件为假,但仍执行了一次循环体
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int secret, guess;
srand(time(0));
secret = rand() % 100 + 1; // 1-100随机数
do {
printf("猜一个数字(1-100): ");
scanf("%d", &guess);
if (guess > secret)
printf("太大了!\n");
else if (guess < secret)
printf("太小了!\n");
} while (guess != secret);
printf("恭喜,猜对了!\n");
return 0;
}
for循环将初始化、条件判断和循环变量更新集中在一行,结构清晰,是使用最频繁的循环结构。
语法:
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体语句
}
执行流程: 先执行初始化(仅一次),然后判断条件,若为真则执行循环体,然后执行更新表达式,再判断条件,如此反复,直到条件为假退出。
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d ", i);
}
printf("\n");
return 0;
}
#include <stdio.h>
int main() {
int n;
long long factorial = 1;
printf("请输入一个非负整数: ");
scanf("%d", &n);
if (n < 0) {
printf("负数没有阶乘\n");
} else {
for (int i = 1; i <= n; i++) {
factorial *= i;
}
printf("%d! = %lld\n", n, factorial);
}
return 0;
}
#include <stdio.h>
int main() {
// 寻找第一个能被7整除的数
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
printf("第一个能被7整除的数是: %d\n", i);
break; // 找到后立即退出循环
}
}
return 0;
}
#include <stdio.h>
int main() {
// 打印1到10之间的奇数
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 偶数跳过
}
printf("%d ", i);
}
printf("\n");
return 0;
}
循环内部可以包含其他循环,称为嵌套循环。常用于处理多维数组、打印图形等场景。
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main() {
int rows = 5;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
无限循环是指条件永远为真,通常用于需要持续运行直到特定事件发生的场景(如服务器监听、菜单程序)。可以通过break或条件标志退出。
#include <stdio.h>
int main() {
int choice;
while (1) { // 无限循环
printf("1. 选项1\n2. 选项2\n3. 退出\n请选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("执行选项1\n");
break;
case 2:
printf("执行选项2\n");
break;
case 3:
printf("退出程序\n");
return 0; // 或 break; 但需要跳出while
default:
printf("无效输入\n");
}
}
return 0;
}
for(;;) 或 while(1) 或 while(true)(C99引入stdbool.h后可使用bool类型)。
#include <stdio.h>
int main() {
int n, i, isPrime;
printf("请输入一个正整数: ");
scanf("%d", &n);
if (n <= 1) {
printf("%d 不是质数\n", n);
return 0;
}
isPrime = 1; // 假设是质数
for (i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = 0;
break;
}
}
if (isPrime)
printf("%d 是质数\n", n);
else
printf("%d 不是质数\n", n);
return 0;
}
while(i<10); { ... },导致循环体为空,陷入死循环。do {...} while(cond) 必须加分号。for(int i=0; ...),变量i仅在循环内有效。使用传统编译器时注意。while(i = 10) 会将10赋给i,条件永远为真,导致死循环。
循环语句让程序具备了重复执行的能力,是处理批量数据、实现复杂逻辑的基础。熟练运用while、do-while和for循环,并结合break和continue,可以编写出高效、优雅的代码。
下一章我们将学习数组,它是存储多个同类型数据的结构,常与循环结合使用。