1.while循环语句
1.1 while 和 if的对比
1.1.1语法结构
if(表达式) 语句; while(表达式) 语句;//如果循环体有多个语句,要有程序块{}括起来
while表达式为真,循环执行对应语句,直到不满足限制条件。
1.1.2实例
#include <stdio.h> int main() { if(1) printf("hehe\n"); //if表达式为真,结果:hehe return 0; }
#include <stdio.h> int main() { while(1) printf("hehe\n"); //while表达式为真,结果为无限循环打印hehe return 0; }
1.2 while的语法的执行流程
while语句,
1.进入判断表达式,判断为真,进入循环。
2.执行语句,1通过continue进入新的一轮循环,2执行完while剩下的语句后进入新的一轮循环,3通过break可以跳出循环
3.如果判断表达式为真,进入循环,为假,跳出循环
1.3 while循环的实践
题目:在屏幕上打印1~10的值
#include <stdio.h> int main() { int i = 1; while(i<=10) { printf("%d\n",i); //每次打印完之后,i自己加上1。 i = i + 1; } return 0; }
每次打印完,i就会加1,直到 i =11的时候就会跳出循环
1.4 while和break在while语句中
while循环中,
break用于永久终止循环
continue跳过本次循环后面的代码,直接去判断部分,进行下一次的判断
1.4.1 break 在while语句中
看下面代码的运行结果?
int main() { int i = 1; while(i<=10) { i++; if(5==i) break; printf("%d ",i); } return 0; }
i=1进入循环,i++就是 i=i+1 , i = 2 , 打印2
i=2进入循环,i++ , i=3,打印3
i=3进入循环,i++ , i=4,打印4
i=4进入循环,i++ , i=5,break直接跳出循环,结束。
1.4.2 while在while语句中
看这个代码的结果是什么:
int main() { int i = 1; while(i<=10) { i++; if(5==i) continue; printf("%d ",i); } return 0; }
i=1进入循环,i++就是 i=i+1 , i = 2 , 打印2
i=2进入循环,i++ , i=3,打印3
i=3进入循环,i++ , i=4,打印4
i=4进入循环,i++ , i=5,continue跳过本次循环,判断为真,再次进入循环
i=5进入循环,i++ , i=6,打印6
i=6进入循环,i++ , i=7,打印7
i=7进入循环,i++ , i=8,打印8
i=8进入循环,i++ , i=9,打印9
i=9进入循环,i++ , i=10,打印10
i=10进入循环,i++ , i=11,打印11
i=11,表达式判断为假跳出循环。
int main() { int i = 1; while(i<=10) { if(5==i) continue; printf("%d ",i); i++; } return 0; }
当 i=5时,continue跳过后面的代码,进入新的一轮循环
又遇到continue,跳过后面的代码,进入新的一轮循环
所以就死循环了
1.5 while语句的练习
题目:输入一个正的整数,逆序打印这个整数的每一位
例如:
输入:1234,输出:4 3 2 1
输入:521,输出:1 2 5
解题思路:想要一位一位地打印,只要把该整数的每一位提取出来就可以了,
1234提取4,1234 % 10 = 4 ,
123提取3,123 % 10 = 3,
12提取2,12 % 10 = 2,
1提取1,1 % 10 = 1;
然后我们的问题转换成了,怎么提取123,12,12,其实简单,只要把1234 / 10 =123, 123 / 10 =12, 12 / 10 =1;
我们来看实现代码:
#include <stdio.h> int main() { int n = 0; scanf("%d",&n); while(n) { printf("%d ",n%10); //下面等同于n=n/10; n /= 10; } return 0; }
2.for循环语句
2.1 for循环的语法形式
for循环的语法形式:
for(表达式1;表达式2;表达式3) 语句;//如果循环体有多个语句,要有程序块{}括起来
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
表达式与表达式之间用 ;来隔开
2.2 for循环的执行流程
表达式1 初始化
表达式2 判断,判断决定进入循环与否
表达式3 改变变量的值
2.3 for循环实践
题目:打印1~10的值
#include <stdio.h> int main() { int i = 1; for(i=1;i<=10;i++) { printf("%d ",i); } return 0; }
我们来对比一下 for 循环和 while 循环
for循环
1.初始化 i=0 ;
2.改变循环变量的值,i++ 来代替了 i = i + 1;
不变的是:
判断条件的存在: i<=10
#include <stdio.h> int main() { int i = 0; while(i<=10) { printf("%d\n",i); //每次打印完之后,i自己加上1。 i = i + 1; } return 0; }
2.4 break和continue在for循环中
2.4.1 break在for循环中
break在for循环中,会直接跳出循环体
#include<stdio.h> int main() { int i=0; for(i =1; i<=10;i++) { if(i==5) break; printf("%d ",i); } return 0; }
当 i=5 的时候,break直接跳出循环就只打印1 2 3 4.
2.4.2 continue在for循环中
下面的结果是什么?
#include<stdio.h> int main() { int i=0; for(i =1; i<=10;i++) { if(i==5) continue; printf("%d ",i); } return 0; }
continue的作用就是跳过本次循环后面的代码,继续进入新的循环
根据for的执行流程,continue会跳过后面的printf("%d ",i),进入表达式3,对 循环变量 i 的值进行改变,然后进入表达式2判断,最后这次进入循环体。
总结:continue跳过本次循环,break永久跳出循环。
2.5 for语句的循环控制变量
建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制
#include<stdio.h> int main() { int i=0; for(i =1; i<=10;i++) { printf("%d ",i); i = 12; } return 0; }
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0; //前闭后开的写法 for(i=0;i<10;i++) {} //两边都是闭区间 for(i=0;i<=9;i++) {}
看下面的例子,我们看到 i<10,10为arr数组的元素个数,如果改成i<=9,9是没有任何意义的。
int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int i=0; 1| for(i=0;i<10;i++) { printf("%d ",arr[i]) } 2| for(i=0;i<=9;i++) { printf("%d ",arr[i]) } 3| for(i=100;i<=200;i++) { printf(); } return 0; }
而3|循环中我们用闭区间,我们发现无论是闭区间还是开区间,其实是为了将限制条件更好地理解,哪个有意义我们就选择哪个。
2.6 for 循环的变种
for循环中的初始化有些情况可以省略,比如:前面有 i 的初始化
int main() { int i = 0; for(i=0;i<10;i++) { printf("hehe\n"); } return 0; }
int main() { int i = 0; for(;i<10;i++) { printf("hehe\n"); } return 0; }
for循环中,一些情况,初始化是不能省略的,比如:下面关于变量是 j 的循环需要进行三次,必须要重新初始化才能再打印3次hehe。
int main() { int i = 0; int j = 0; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("hehe\n"); } } return 0; }
int main() { int i = 0; int j = 0; for(;i<3;i++) { for(;j<3;j++) { printf("hehe\n"); } } }
C99标准才能支持的写法 :将 i 的定义写在for循环中(MSVC编译器是不支持的)
int main() { for(int i=0;i<10;i++) { printf("hehe\n"); } return 0; }
使用多余的一个变量来控制循环
int main() { int x,y; for(x=0,y=0;x<2 && y<5;++x,y++) { printf("hehe\n"); } return 0; }
2.7 一道笔试题
请问循环多少次
#include<stdio.h> int main() { int i = 0; int k = 0; for(i=0,k=0;k=0;i++,k++) k++; return 0; }
答案:循环0次,因为表达式2的 = 并不是判断,而是赋值,k=0是判断为假,不进入循环。
- 在C语言中,0表示假,非零表示真
3.do while语句
3.1 do while的语法结构
do 循环语句;//语句多的时候我们要用程序块{}将语句括起来 while(表达式);
3.2 do while的执行流程
与whlie不同的是:条件表达式在循环体之后,我们无论循环变量符不符合条件,我们都会先进入循环。
3.3 do while实践
题目:打印1~10的值
#include <stdio.h> int main() { int i = 1; do { printf("%d ",i); i = i + 1; }while(i<=10); return 0; }
3.4 do while练习
下面代码的打印结果是什么呢?
#include<stdio.h> int main() { int i = 1; do { i++; if(i==5) continue; printf("%d ",i); }while(i<=10); return 0; }
i=1进入循环,i++就是i=i+1,i=2,轮个打印,当 i=5 的时候,continue跳过下面的打印,进入下一次的循环,然后 i=6,7,8,9,10,11. 11打印完后进行判断才不成立,跳出循环。
下面这个代码的打印结果为多少呢?
#include<stdio.h> int main() { int i = 1; do { if(i==5) continue; printf("%d ",i); i++; }while(i<=10); return 0; }
i=1进循环,打印 1,然后再加1.
i=2进循环,打印 2,然后再加1.
i=3进循环,打印 3,然后再加1.
i=4进循环,打印 4,然后再加1.
i=5进循环,continue跳出循环
i=5进循环,continue跳出循环
i=5进循环,continue跳出循环
所以结果为1 2 3 4 (死循环)