【C】循环结构
循环结构
当需要重复执行一段代码很多次时,可以使用循环结构来解决问题
while语句
语法:
while (表达式)
循环体
只要表达式的值为真(非零),就会不断执行循环体里的内容。
实例1
- 计算1+2+3+...+100的结果
int main()
{
int i=1, sum=0;
while (i<=100)
{
sum = sum + 1;
i = i + 1;
}
printf("结果是:%d\n",sum);
return 0;
}
运行结果
结果是:5050
实例2
-
统计从键盘输入的一行英文句子的字符个数。
-
getchar函数用于从标准输入流里读取下一个字符,请参考:getchar -- 从标准输入流中获取字符
int main()
{
int count = 0;
printf("请输入一行英文字符:");
while (getchar() != '\n') //若接收到的字符不是
{
count = count + 1;
}
printf("你总共输入了%d个字符!\n",count);
return
}
请输入一行英文字符:Hello World!
你总共输入了12个字符!
do...while语句
语法:
do
循环体
while (表达式);
while语句是先判断表达式值是否为真,如果为真再执行循环体里的内容;而do...while语句相反,它是先执行循环体的内容,再判断表达式的值是否为真,是再执行下一次循环。
while与do...while的比较
分析while与do...while之间的不同
-
while
while语句条件判断的位置在循环的入口处,所以while语句是入口条件循环
while (i <= 100) { sum = sum + 1; i = i + 1; }
-
do...while
do...while语句条件判断的位置在循环的出口处,所以do...while语句是出口条件循环
do { sum = sum + 1; i = i + 1; }while (i <= 100); //do...while语句,while之后有分号
由于do...while是出口条件循环,所以它的循环体至少都会被执行一次
循环的基本结构
int count = 0; //初始化计数器
while (count < 10) //循环条件的判断
{
printf("Hello!\n");
count = count + 1; //更新计数器
}
for语句
语法:
for (表达式1; 表达式2; 表达式3)
循环体
三个表达式用分号隔开,其中:
- 表达式1是循环初始化表达式
- 表达式2是循环判断表达式
- 表达式3是循环调整表达式
int main()
{
int count;
for (count = 0; count < 3; count++)
{
printf("Hello!\n");
}
return 0;
}
运行结果
Hello!
Hello!
Hello!
练习
-
写一个程序:判断一个数是否为素数。
- 素数指在大于1的自然数中,除了1和此数自身外,无法被其他自然数整除的数。
- 关于素数的求法有很多,这里用比较朴素暴力的方式:迭代测试从2到num/2所有整数是否能被整除(num为待测试的整数),如果没有出现能被整除的整数,那么它就是素数。
int main() { int i, num; _Bool flag = 1; printf("请输入一个整数:"); scanf("%d",&num); for (i = 2; i <= num/2; i++) { if (num % i == 0) { flag = 0; } } if (flag) //flag=1则执行 { printf("%d是一个素数!\n", num); } else { printf("%d不是一个素数!\n", num); } return 0; }
灵活的for语句
-
表达式1,表达式2和表达式3可以按照需要进行省略(但分号不能省:
-
for ( ; 表达式2; 表达式3)
-
for (表达式1; 表达式2; )
-
for (表达式1; ; )
-
for ( ; ; ) // 死循环
-
...
int count = 0; for (count; count < 3;) { printf("Hello!\n"); count++; }
-
-
表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式(即用逗号分隔多个表达式)
int i, j; for ( i=0, j=10; i < j; i++, j--) { printf("%d\n", i); } return 0;
运行结果
0 1 2 3 4
-
C99允许在for语句的表达式1中定义变量,但在表达式1中定义的变量只能在循环中使用,出了循环就无法使用:
- for (int i =0 ; i < 100; i++)
for (int i=0, j=10; i < j; i++, j--) { printf("%d\n",i); }
运行结果
0 1 2 3 4
循环嵌套
-
与分支结构一样,循环结构也能实现嵌套。分支结构决定了哪些语句会被执行,而循环结构决定了哪些语句会被执行多少次。
-
对于嵌套的循环结构,它的执行顺序是由内到外,先执行内层循环,再执行外层循环
int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("i = %d, j = %d\n",i,j); } }
运行结果:
i = 0, j = 0 i = 0, j = 1 i = 0, j = 2 i = 1, j = 0 i = 1, j = 1 i = 1, j = 2 i = 2, j = 0 i = 2, j = 1 i = 2, j = 2
练习
-
打印九九乘法表:
int i, j; for (i = 1;i<=9;i++) { for (j = 1; j <= i;j++) { printf("%d * %d = %-2d",i , j, i * j); //%-2d表示将数字按宽度为2,采用左对齐方式输出,若数据位数不到2位,则右边补空格 } putchar('\n'); //putchar用于输出一个字符到标准输出流中。 }
运行结果:
1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
break和continue——循环辅助语句
break语句
- break语句可以用来让程序在中途跳出循环
int main()
{
int i;
for (i = 0; i < 10; i++)
{
if (i == 3)
{
break;
}
}
printf("i = %d", i);
return 0;
}
运行结果:
i = 3
在这个程序中,i++
本来会循环10次,但通过break语句,程序循环到i等于3时就会跳出循环。
-
对嵌套循环来说,break中负责跳出它所在那一层的循环。如果要跳出外层循环,需要再布置一个break语句
int main(){ int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if (j == 3) { break; } } } printf("i = %d, j = %d \n",i, j); return 0; }
运行结果:
i = 10, j = 3
内层循环跳出了,外层循环还在继续执行。若需跳出整个循环,则需:
int main(){ int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if (j == 3) { break; } } if (j == 3) { break; } } printf("i = %d, j = %d \n",i, j); return 0; }
运行结果:
i = 0, j = 3
continue语句
-
continue语句用于跳过本轮循环,执行下一轮循环
int main(){ int ch; printf("请输入一串英文:"); while ((ch = getchar()) != '\n') { if (ch == 'H') { continue; } putchar(ch); } return 0; }
运行结果:
请输入一串英文:Hello world ello world
H被跳过了,其他原文输出
拓展
goto语句
goto语句作用为:直接跳转到指定的标签位置
语法: goto 标签 (标签要定位于某个语句前边)
int main()
{
int i = 5;
while (i++) //死循环
{
if (i > 10)
{
goto Label;
}
}
Label: printf("Here, i = %d\n",i); //定义标签
return 0;
}
运行结果
Here, i = 11
注意:在程序开发中,要尽量避免使用goto语句。因为随意使用goto语句在代码里跳来跳去,会破坏代码原有的逻辑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了