分支&循环超全超细知识点总结!
大家好,这里是瑶瑶子,一个努力学习计算机知识的大学生,在这里分享自己的学习内容,希望分享的知识和内容能够对你们有帮助。可能存在理解不深刻、全面,说法不准确的地方,希望给出宝贵的建议,让我们共同进步和成长!
知识体系导图
图片:
C语言结构(三种)
首先我们要知道,C语言是一门结构化的程序设计语言,C语言有三种结构,分别是:顺序结构、选择结构、循环结构
·顺序结构:程序从头到尾按照顺序依次进行,没有选择性(某部分代码执行某部分代码不执行),也不会重复执行某部分代码。
#include <stdio.h>
int main()
{ printf("hello word\n");
printf("happy new year\n");
return 0;
}
·选择结构:是根据条件,判断是否能否执行程序。所以说是具有选择性的。选择结构对应的语句是选择语句,包括if语句、switch-case语句。
举个例子:
#include<stdio.h>
int main()
{ int i=0;
printf("1+1=\n");
scanf(%d",i);
if(i=2)
{
printf("恭喜你回答正确\n");
}
else
{
printf("很遗憾,你回答错误\n")
}
return 0;
}
我们可以看到当i等于2时会执行if后面的语句,i不等于2时执行else后面的语句 。
当然这个if语句后面会细讲
·循环结构首先循环,就是让代码循环往复做一件事。循环结构相对应是循环语句,包括while循环、for循环、do while循环。
举个例子:
#include<stdio.h>
int main()
{
int i=1;
while(i<=3)
{
printf("我真棒\n");
i++;
}
return 0;
}
这个代码的执行结果是三个一样的“我真棒”
其实可以看出来while和if都是先判断再执行,但是while要重复执行。也可以看得到,循环会帮助我们完成需要重复做的事情。虽然这里是三次,如果是五十次呢?不用循环岂不是要输入五十次”我真棒”?
所以循环的存在很有意义。
分支语句
1、if语句
·语法结构:
一,
//单分支
if(表达式)
{
语句1;
}
解释:括号内的表达式可以是关系表达式(指运算符为<、>、<=、>=、==、!=的表达式)、逻辑表达式(指运算符为||、&&、非1的表达式)、数值表达式(运算符为赋值号=)。
语句1:就是当括号内表达式的结果为非0时索要执行的语句(0为假,非0为真)。
当然这里的语句也可以是多条。
语法结构 二、
//多分支语句(级联if语句)
if(表达式1)
{
语句1;
}
if else(表达式2)
{
语句2;
if else(表达式3)
{
语句3;
}
......
else(表达式n)
{
语句n:
}
这里的一个{ }就是一个代码块,里面其实也不一定就是单单的一个语句,根据需求也可以包含多个语句。
嵌套的if
简单来说,就是if后面的语句也是一个或多个if语句,成一种嵌套形式。
举个例子:求a、b、c三个数哪个数最大
//嵌套的if
#include<stdio.h>
int main()
{
int a=3
int b=2;
int c=6;
if(a>b)
{
if(c>a)
{
printf("c最大\n");
}
else
{
printf("a最大\n"):
}
}
else (b>a)
{
if(c>b)
{
printf("c最大\n");
}
else
{
printf("b最大\n");
}
return 0;
}
注意:1,一条时可以省去大括号,多条时必须加上大括号。
2,if语句括号的后面是没有分号的。
3,if大括号内索要执行的语句后面是要有分号的。
4,else 总是和最近的那个没有匹配的if进行匹配,简称为就近就近原则。
我们来看一个例子:
//悬空else问题
#include<stdio.h>
int main()
{
int a=1;
int b=2;
if (b==3)
if(a==1)
printf("honesty");
else
printf("calculation");
return 0;
}
你觉得这个代码的运行结果是?
如果你觉得是calculation
那么恭喜你,想错了
其实我第一次看这个代码也觉得很奇怪,怎么有两个if而且我们初学者的视角,会觉得if的条件没满足,那就跳到else,执行else后面的结果吧,而且第一个if是和else对其的欸。但计算机不会这么认为,它会把else和离它最近的那个没有匹配的if进行匹配,当与它匹配的那个if条件不满足时,才会执行else后面的语句。
所以这个代码的执行结果是:什么也不执行。
我们分析一下,b==3不满足,也就是这个条件为假,而且又没有和这个if匹配的else,那么编译器就会自动跳转到return 0;也就是什么结果都不会输出。
但是如果你就是想让这个代码的第一个if和else匹配,或者是你不想引起歧义,根据上面那个代码,我们的原意是想表示,如果b == 3,a == 1,输出”honesty”,否则输出“calculation”,那么我们应该在if后面加一对花括号{ }
也就是下面这样
if(b==3)
{
if(a==1)
{
printf("honesty"):
}
}
else
{
printf("calculation");
}
由上可知,加上花括号的好处有很多,不会引起歧义,让读者易读易理解代码。
所以作为一个良好的编程习惯,我们把if或者else后面不管几条语句,我们都加上花括号。
5,(重要的事情说三遍!!!)
关系表达式中的“= =”不要误写成“=” !!!
关系表达式中的“= =”不要误写成“=” !!!
关系表达式中的“= =”不要误写成“=” !!!
我们来举个例子
int i=0;
scanf("%d",i);
if(i==3)
{
printf("星期三\n");
}
只有当我们输入3,时输出结果才是”星期三”,否则什么也不输出。
int i=0;
scanf("%d",i):
if(i=3)
{
printf("星期三\n");
}
当我们去运行这个代码时会发现,无论我们输入的是什么数字,输出结果总是”星期三“,这和我们理想结果有偏差。
解释:
首先我们要明白的是,什么时候才能执行if后面的语句。前面也提到了:当表达式结果为非0时。
” ==“是关系运算符,它表示的是”相等关系“,只有该符号前后的数据相等时,该表达式的结果就为非0,不相等时为假。只有表达式结果为非0时,才会执行if后语句。这也就是为什么只有输入3时才会打印”星期三“。
”=“是赋值号,表示把运算符后面的值赋值给前面。如:a=b就是把b的值赋给a,表示的不是关系,而是赋值这一动作。赋值也是运算的过程,也有结果,赋值表达式的结果就是赋值符号右边的值!!!所以(i=3)这个表达式表示的就是把3赋值给i,这个表达式的结果为3,非0,执行if后面的语句,所以无论输入什么,这个表达式结果都为非0,都打印”星期三“。
2、switch-case语句
语法结构:
switch(整形表达式)//括号里面表达式的结果必须为整形
//switch是表示判断
{
case 1://case后面不一定是数字,但也一定是整形常量表达式
语句1;
case 2://case相当于一个如果,根据switch判断从哪个case进入
语句2;
...
//花括号里面的为语句项,基本结构如上
}
注意:case后面的必须是整形常量表达式,注意是常量,不是变量!
还是先整个例子:根据我们所输入的数字,输出对应的星期几。
如果用if语句如何表示?
#include<stdio.h>
int main()
{
int i=0;//初始化
scanf("%d",&i);
if(i==1)
{
printf("星期一\n");
}
else if(i==2)
{
printf("星期二\n");
}
else if(i==3)
{
printf("星期三\n");
}
else if(i==4)
{
printf("星期四\n");
}
else if(i==5)
{
printf("星期五\n");
}
else if(i==6)
{
printf("星期六\n");
}
else if(i==7)
{
printf("星期天\n");
}
else
return 0;
}
输出结果如下
用switch-case语句表示?
#include<stdio.h>
int main()
{
int i=0;
scanf("%d",i);
switch(i)
{
case 1:
printf("Monday\n");
case 2:
printf("Tuesday\n");
case 3:
printf("Wednesday\n");
case 4:
printf("Thursday\n");
case 5:
printf("Friday\n");
case 6:
printf("Saturday\n");
case 7:
printf("Sunday\n");
}
return 0;
}
感觉的确比if语句简洁哈。但是这个代码正确吗?或者准确吗?
我们看一下运行结果:
输入7还是正常,为什么输入3会输出5个结果呢,不应该是Wednesday这一个结果吗?
这就要引入到一个知识点:break与continue 用法(continue会在后文循环部分讲到)
break:
表示“停止和终止”
上面那个代码输出结果有问题,是因为case的确是入口,从case3进入,代码向下执行,可出口呢?也就是说代码只有把case3之后的代码都执行完,才会跳出这个体系,这也就是为什么Wednesday后面一直到Sunday都被打印出来。我们理想的输出结果就是,输入3,输出Wednesday。也就是说我们要让这个代码打印完Wednesday之后,就跳出这个体系(或者说有个出口),不再继续往下打印。这里我们就需要用“break”完成这个目的,让这个代码在该结束的地方结束并跳出这个体系。
break相当于一个终止标志,当代码有机会遇到break时它就会跳出这个体系(这里就是指switch-case)。综上,case决定switch语句入口,break决定出口。
所以我们看一下改进后的代码:
(注意:break后面也是要加分号的)
#include<stdio.h>
int main()
{
int i=0;
scanf("%d",i);
switch(i)
{
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
}
return 0;
}
输出结果如下,看,Perfect!
反思:1,每一个case必须要对应一个case吗?
·其实不然,还是根据具体需求,在合适的位置或者你想要停下来的位置加入break即可。
2,最后一个case是不是不用加break也行?
·就编译结果来说最后一个case其实要不要break没什么影响的。
但是为了下次修改代码(如我们需要加一个case,这个时候必须要把之前的最后一个case加一个break)比较方便不容易出错,而且作为一个好的编程习惯,我们还是在最后一个case也加上一个与之匹配的break.
3,如果我们输入的那个整形,并没有相应的case与之对应?
·这就需要用到default了,英文是“默认”的意思,其实就是一个默认的入口。当输入整形没有与之对应的case时,那就走default这个入口。
举个例子:
//将百分制成绩转换为等级制:
#include<stdio.h>
int main()
{
int grade=0;
printf("请输入成绩:>\n");
scanf("d",&grade);
int grade/=10;
switch(grade)
{
case 10:
case 9://这里也印证了不是每一个case都要匹配break
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break
default://默认入口
printf("E\n");
break;
}
return 0;
}
循环语句
1、while循环
语法结构:
while(表达式)
{
循环语句;//我们把这个大括号包括里面的内容称作“循环体”
}
注意:循环体内必须有改变条件的机会,否则就是死循环或者无限循环(如果需要的就是死循环,当俺没说(✿◕‿◕✿))
执行流程:
break用法:
当循环体内有机会执行到break时,那么就会跳出这个循环体,结束循环,继续按照程序向下执行下面的代码。
continue用法:
当循环内部有机会执行到continue时,那么continue后面的代码(循环体内的)不再执行,程序认为此次循环结束,重新来到while的判断部分开启下一次循环。
我们还是用例子说话:
#include<stdio.h>
int main()
{
int i=1;
while(i<=10)//判断进入循环体条件
{
printf("%d\n",i);
i++;
}
return 0;
}
执行结果:
我们看一下加入break会发生什么:
#include<stdio.h>
int main()
{
int i = 1;
while (i <=10)
{
printf("%d\n", i);
if (i == 3)
{
break;
}
i++;
}
return 0;
}
执行结果如下:
解释:当执行三次循环之后i==3,这个时候进入if语句,遇到break,跳出循环体不再i++也不再进入循环,所以执行结果为1 2 3.
再看一下把break换成continue会怎样:
#include<stdio.h>
int main()
{
int i = 1;
while (i <=10)
{
printf("%d\n", i);
if (i == 3)
{
continue;
}
i++;
}
return 0;
}
执行结果如下:1 2 3 3 3 3_的循环
解释:当三次循环后i==3,执行if 语句,遇到continue,那么不再执行continue后面的代码(循环体内的),这里也就是i++,结束本次循环,再开启下一次循环,因为 i == 3 < 10,所以进入循环体,又遇到continue…如此循环往复,所以输出结果为1 2 3 3_的循环。
2、for循环:
语法结构:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1:初始化部分,即初始化循环变量,确定循环变量从多少开始(注意:不是创建循环变量)。
表达式2:条件判断部分,判断循环变量何时终止。
表达式3:调整部分,用于调整循环变量。
执行流程:
·与while循环比较:
表达式1相当于while循环外的初始化部分,表达式2相当于while后面的表达式1 都是条件判断部分,表达式三相当于while花括号里面的条件调整部分。
由上,我们可以看到,for语句比while语句更直观也更便于调整和更正。
区别举例:
- while循环:
#include<stdio.h>
int main()
{
int i = 1;
while (i <=10)
{
printf("%d\n", i);
if (i == 3)
{
continue;
}
i++;
}
return 0;
}
这个代码上面讲过,执行结果为 1 2 3 3 3…3 3_,这个死循环的结果
- for循环
#include<stdio.h>
int main()
{
int i = 0;
for(i=1;i<=10;i++)
{
printf("%d\n", i);
if (i == 3)
{
continue;
}
}
return 0;
}
这个代码的执行结果为什么不一样呢?
解释:其实根本原因是因为while循环和for循环的执行流程不同。
- while循环:continue之后的代码i++没有执行
- for循环:continue后面没有其他代码,expr3(i++)还是照样执行,所以i==3后,continue结束此次循环,但是注意还是先要来到expr3加1此时i ==4,再继续循环来到expr2判断,再又一次进入循环体如此进行下去,得到的不是死循环,而是1 2 3 4 5 6 7 8 9 10
注意:
- 不要在for循环体内修改循环变量,防止循环失去控制(变成死循环or无限循环)
举个例子:
#include<stdio.h>
int main()
{
int i = 0;
for(i=1;i<=10;i++)
{
if (i = 5)//注意:这里是赋值符号“=”,不是关系等于符号“==” 意思把5赋值给i
{
printf("%d\n", i);
}
}
return 0;
}
执行结果为:5的循环
解释:因为第一次进入循环或者说每次循环,i都被修改为了5<10(虽然i++了,但是再进入后又被修改为了5)如此循环往复,所以输出结果为5的循环。
- 建议把循环控制变量(expr2) 采用“前闭后开区间”写法。
#include<stdio.h>
int main()
{
int i = 0;
for(i=0;i<10;i++)
{
printf("%d\n", i);
}
return 0;
}
i=0;i<10的写法优于i=1;i<9
因为前一种写法10,有一定的意义:
1,10次循环
2,10次打印
3,10个元素
for循环的一些变种:
- 省略:
int main()
{
for(;;)
{
printf("I am chinese\n");
}
}
1,for循环的初始化,判断,调整这三个部分都是可以省略的。但是注意,虽然判断的部分被省略了,但其实暗含判断条件为恒为正。
2,如果不是很熟练,建议不要随便省略。
举个例子:(不省略)
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(i=0;i<10;i++)
{
for (j = 0; j < 10; j++)
{
printf("Good morning\n");
}
}
return 0;
}
执行结果如下:100个Good morning
(省略)
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(;i<10;i++)
{
for (;j < 10; j++)
{
printf("Good morning\n");
}
}
return 0;
}
输出结果:10个Good morning
为什么这里不是100个呢,不是只是把 i=0和j=0省略了吗,结果应该也是100个Good morning才对呀。
这就是不熟练运用省略造成的后果!
解释:首先i=0进入第二个循环,第二个循环进行了十次之后出循环体再进入第一个循环,i=1,准备进入第二个循环,注意,此时j=10,也就是说根本进不去第二个for循环!!!因为进入第二个循环前j还是等于0,不像没有省略的那个版本,在再次进入j那个循环体时没有expr1把j重新初始化为0!这就是问题所在。
- 两个循环变量(比较少见)
//变种2
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(i=0,j=0;i<3&&j<7;i++,j++)//&&表示“并且”的意思
{
printf("believe yourself\n");
}
return 0;
}
输出结果如下:3个believe yourself
3、do while循环
语法结构:
//do while循环结构
do
{
循环体语句;
}
while(表达式)//循环条件
至少执行一次,使用场景有限,所以很少使用
执行流程:(先执行后判断)
以上就是关于分支和循环基础知识的全部啦!希望所讲的内容对你有帮助,思维导图和流程图都是自己制作的,希望能帮助你们记忆和理解。博主本人正在读大一,也是站在初学者的角度去努力理解并且尝试讲解,关于C语言分支和循环的讲解可能有不太准确的地方,但写博客的目的不就是记录学习分享学习内容和知识吗!希望各位同学能给出宝贵的意见,我会很高兴去听到他人的建议和理解,让我们共同进步!(❤ ω ❤)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142484.html