循环语句
循环结构:允许一段代码重复执行直到满足某个特定条件,循环语句有效地编写代码,避免复杂度–>使用for、while、do while等实现循环结构使用for、while、do while等实现循环结构
本次开始循环结构的学习,会有习题加深理解
while循环
语法: while(循环条件) 循环体语句块
- (1) 判断循环条件是否满足,不满足就退出循环体。
- (2) 执行循环体。
- (3) 返回第(1)步
如果循环条件根本不能成立,则不执行循环体,若循环条件总是成立,则成为死循环。根据不同实际需要来控制循环条件和控制循环变量数值
//如果条件一直满足,就会出现死循环 while(1) { printf("死循环\n"); }
while循环的实践
在屏幕上打印1~10的数值
int mian() { int i=0; while(i<=10) { printf("%d ", i); i = i+1; } return 0; }
补充:if语句与while语句区别
if和while语句在语法结构是十分相似的
if(条件表达式) 语句块 while(循环条件) 语句块
区别:虽然if和while语句都是通过循环条件,判断是否执行语句块,但是while语句是循环语句,意味着while中的语法块可以多次执行,直到不满足条件表达式。
for循环(使用频率最高)
语法: for(表达式1;表达式2;表达式3) 循环体语句块
- 表达式1:用于循环变量的初始化–省略不对循环控制变量赋值
- 表达式2:用于循环结束条件判断–省略进入死循环
- 表达式3:用于循环变量调整–省略不对循环控制变量经行调整
- (1)计算初始表达式。
- (2)判断循环条件,若满足,则执行;否则,退出循环。
- (3)执行循环。
- (4)返回第(2)步。
整个循环过程中,表达式1初始化部分只被执行1次,剩下就是表达式2、循环语句、表达式3在循环。
for循环的实践
在屏幕上打印1~10的数值
int main() { for(int i=0;i<10;i++) { printf("%d\n",i); } return 0; }
while循环和for循环的对比
while和for在实现循环中,都有三个部分:循环变量初始化、条件表达式、控制循环变量大小。从形式来说for循环的三个部分非常集中,方便代码的维护,而while循环的三个部分比较分散
当需要使用循环语句时,while循环和for循环都是不错的选择。
小技巧:当不知道for循环判断条件怎么设定,可带入个临界值对比预期效果,再进行调整判断条件
重点还是放在上面的循环语句
Do-while循环
语句: do 循环体语句块 while(循环条件);//不要忘记;号
Do-while语句属于当型循环结构,至少循环一次循环体语句再经行判断循环条件是否继续进入循环中
- (1) 执行一次循环体。
- (2) 判断是否满足循环条件,若满足,则循环,转到(1)继续执行;否则,执行随后的语句。
break和continue语句
在循环执行过程中,可能会出现状况,需要提前终止循环。C语言提供了break和continue关键字。
break:是终止本级循环,常用于for,while,do以及switch语句中。当执行一个循环体时,break被执行将立刻跳出循环体,且只退出本级循环
continue:是跳过(不执行)本次循环continue后面的代码,转为继续执行下一次循环体。for循环和while循环中有所差异,在于受到调整循环变量大小位置上的影响
循环的嵌套
前面学习for、while、Do-while循环,这三种循环往往嵌套在一起可以更好的解决问题
比如:实现排序,做题
练习:打印100~200之间的素数(素数⼜称质数,只能被1和本身整除的数字)
int main() { for (int i = 101; i <= 200; i=i+2)//产生100到200的数字--偶数一定是素数 { int flag = 1; for (int j = 2; j < i; j++)//能被2到N-1整除的不是素数 { if (i % j == 0) { flag = 0; break; } } if(flag==1) printf("%d ",i); } return 0; }
goto语句(不常用)
如果需要实现在同一个函数内跳转到设置好的标号处的效果,可以用到goto语句和跳转标号。
int mian() { printf("准备开始\n"); goto next; printf("被跳过"); next; printf("程序来到这里"); return 0; }
这里就像goto next与next中内容被注释掉,既然goto语句具有跳转的效果,如果使用不当,可能会打乱程序执行的流程。
使用场景:适用于跳出多层循环,比如嵌套三层for循环需要提前跳出循环,需要三个break才能跳出循环,而goto可以更加快捷跳出循环
建议:自从提倡结构化设计以来,goto就成为有争议的语句,goto语句能不用就不使用
循环语句的效率(来自于高质量的C/C++编程书籍)
这里主要提及了三个方面
- 长短循环在不同层循环的效率问题
- 循环体中逻辑判断设计的效率问题
- for循环变量范围的书写问题
1.尽量应当将最长的循环放在最内层,最短的循环放在最外层,为了减少CPU切换循环层的次数,以便于提高程序效率
2.如果循环体内存在逻辑判断,并且循环次数很大,应将逻辑判断移到外面
3.for语句中循环控制变量循环体的外面,目的为了高效保持循环"流水线"作业,使得编译器能对循环进行优化处理,提高效率。如果N非常大,推荐右边的写法,可以提高效率,如果N非常小,两者效率差别并不明显,建议采用左边的写法,因为程序可读性更强
个人理解:如果需要多次使用判断语句,这样子会导致流水线会停下来,影响到效率,将判断放外面先经行判断,再高效地循环"流水线"工作
3.1不能在for循环体内修改循环变量,可以调整循环变量大小,防止for循环失控
3.2 for循环中循环控制变量的取值采用“半开半闭区间”写法,这样的写法更加直观知道起点到终点的间隔为多少,循环次数为多少
1.for(int i=0;i<N;i++) 2.for(int i=0;i<=N-1;i++)
个人理解:两者的功能是相同的,不管上面的那一种写法并不是固定的,还是根据实际需要选择,如果是实现一样的效果,还是推荐"半开半闭区间",不要忘记循环判断条件取值得小妙招!
感谢各位的观看,本店先更新完C语言章节,C++系列,在C语言系列结束更新。