分支语句和循环语句
Posted 黒讬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分支语句和循环语句相关的知识,希望对你有一定的参考价值。
目录
本章重点讲解分支语句和循环语句的使用
1. 什么是语句?
C语言中由一个分号 ; 隔开的就是一条语句。
如下图:
int a = 0;
printf("Hei Tuo");
1+2;
2. 分支语句(选择结构)
选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程。
2.1 if语句
if语句的一般语法结构形式如下两种:
//第一种
if(表达式)
语句;
//第二种
if(表达式)
语句2;
else
语句3;
//第三种,多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
讲解:如果满足表达式中的条件,行该if条件下的语句,不满足则执行else下的语句。
if语句使用示例:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\\n");
}
else if(age>=18 && age<30)
{
printf("青年\\n");
}
else if(age>=30 && age<50)
{
printf("中年\\n");
}
else if(age>=50 && age<80)
{
printf("老年\\n");
}
else
{
printf("老寿星\\n");
}
}
注意: 如果表达式的结果为真,则语句执行。
在C语言中,0表示假,非0表示真。
如果条件成立,则执行该条件下的多条语句,行使代码块中的功能。
#include <stdio.h>
int main()
{
if(表达式)
{
语句1;
}
else
{
语句2;
}
return 0;
}
注意:这里的一对 { } 就是一个代码块。
说明:
(1)整个if语句可以写在多行上,也可以写在一行上,如:
if(x>0) y=0;else y=-1;
但是,为了程序清晰,提倡写成锯齿形式。
(2)if语句无论写在几行上,都是一个整体。不要误认为if部分是一个语句,else部分是另一个语句。不要一看到分号,就以为是if语句结束了。在系统对if语句编译时,若发现内嵌语句(出现分号),还要检查其后有无else,如果无else,就认为整个if语句结束,如果有else,则把else子句作为if语句的一部分。
注意else子句不能作为语句单独使用,必须是if语句的一部分与if配对使用。
2.1.1 悬空else
如下代码,缺少{}使代码的逻辑模糊,不能清楚展现;导致代码整体的风格不好。
#include <stdio.h>
int main()
{
int a = 0;
int b = 3;
if(a == 1)
if(b == 3)
printf("Hei Tuo\\n");//问题1
else//问题2
printf("hei tuo\\n");
return 0;
}
正确引用{},改正:
#include <stdio.h>
int main()
{
int a = 0;
int b = 3;
if(a == 1)
{
if(b == 3)
{
printf("Hei Tuo\\n");
}
}
else
{
printf("hei tuo\\n");
}
return 0;
}
注意else的匹配:else是和它离的最近的if进行匹配
2.1.2 if书写形式的对比
试看如下举例四个代码:
//代码1
if (condition) {
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\\n");
}
不难看出来,代码2和代码4更好,表现的逻辑更加清晰,整体更合理,不容易出错。
2.2 switch语句
if语句只有两个分支可供选择,而实际问题中出常常需要用到多分支的选择。C语言提供switch语句直接出了多分支选择。
switch语句的作用是根据表达式的值,使流程跳转到不同的语句。switch语句语法结构形式如下:
switch(整型表达式)
{
语句项;
}
语句项:是表示一些case语句
case 整形常量表达式:
语句;
2.2.1 在switch语句中的 break
在switch语句中,是不能直接实现分支的,必须要搭配break使用才能实现真正的分支。
在C语言的 switch(开关语句)中, break可使程序跳出switch而执行switch以后的语句;如果没有break语句,则会从满足条件的地方(即与switch(表达式))括号中表达式匹配的case)开始执行,直到switch结构结束。
如下要满足条件:
1. 输入1-5输出的是“weekday”;
2. 输入6-7输出“weekend”。
#include <stdio.h>
//switch代码演示
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\\n");
break;
case 6:
case 7:
printf("weekend\\n");
break;
}
return 0;
}
由此可知break实际效果是把语句列表划分为不同的部分。
注意:在最后一个 case 语句的后面加上一条 break语句。(这样写是可以避免出现在以前的最后 一个 case 语句后面忘了添加 break语句)。
2.2.2 default子句
当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。
如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签 :
default:
break;
不要忘记最后的default分支。即使程序真的不需要default处理,也应该保留语句: default : break
举例switch:
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\\n", m, n);
return 0;
}
注意:
(1)上面switch一般形式中括号内的“表达式”,其值的类型应为整数类型(包括字符型);
(2)每个case常量必须互不相同;否则就会出现互相矛盾的现象(对switch表达式的同一个值,有两种或多种执行方案);
(3)case和常量表达式之间要有空格;
(4)case和default出现可以在任何位置,其先后次序不影响执行结果,但习惯上将default放在switch-case结构的底部;
(5)case提供了执行某一语句序列的入口,起着标号的作用;多个case可以执行同一语句序列;
case 'a':
case 'b':
case 'c':priintf(">60\\n");
break;
(6)每个case语句的结尾不要忘了加break,否则将导致多个分支重叠。
(7)一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行。
3. 循环语句 while,for,do…while()
循环结构是指在程序中需要反复执行某个功能而设置的一种c结构。它由循环体中程序的条件,判断继续执行某个功能还是退出循环。根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。
3.1 while循环
针对同一件事情我们需要完成很多次的情况。 C语言中给我们引入了:while语句,当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环。
while语句一般形式如下:
//while 语法结构
while(表达式)
循环语句;
while使用举例:
#include<stdio.h>
int main()
{
int a= 0;
while(a<10)
{
a++;//自加
if(a>5)//不等while退出循环,直接判断循环
{
break;//跳出循环
}
}
}
3.1.1 while语句中的break和continue
break介绍
break在while循环中的作用是:在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以while中的break是用于永久终止循环的。
break使用示例:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i++;
}
return 0;
}
这里代码最后会输出的结果是:1 2 3 4。因为当i==5时,遇到break就跳出了循环并且终止。
continue介绍
continue在while循环中的作用是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接 跳转到while语句的判断部分。进行下一次循环的入口判断。
continue语句和break语句的区别是:
continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
注意:
(1)break可以在if-else中使用直接跳出当前循环;
(2)在多层循环中, 一个break语句只向外跳一层;
(3)continue语句的作用是跳过循环体中剩余的语句并到循环末尾而强行执行下一次循环。
3.2 for循环
初始化语句只在循环开始前执行一次,每次执行循环体时要先判断是否符合条件,如果循环条件为true,则执行循环体,再执行迭代语句。所以对于for循环,循环条件总比循环体多执行一次。
3.2.1 语法
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:设置初始条件,只执行一次。可以为零个、一个或多个变量设置初始值。
表达式2:是条件判断部分,用于判断循环时候终止。
表达式3:作为循环的调整部分,用于循环条件的调整。例如使循环变量增值,它是在执行循环体后才进行的。
for循环使用举例:利用for循环,在屏幕上打印1-10的数字,如下程序:
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
for循环和while循环的比较
(1)执行条件的判断方式不同
for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环。
while循环当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出,而不是立即跳出循环。
(2)使用的目的不同
for循环的目的是为了限制循环体的执行次数,使结果更精确。
while循环的目的是为了反复执行语句或代码块。
(3)for循环与while循环是可以无条件等价的。一下是两种等价形式说明。
for(表达式1;表达式2;表达式3)语句
表达式1
while表达式2
{
语句
表达式3
}
3.2.2 break和continue在for循环中
break和continue都是用来控制循环结构的,主要是停止循环。
- break
有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才终止。这时我们可以使用break来完成。break用于完全结束一个循环,跳出循环体执行循环后面的语句。
- continue
continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
示例for中的break与continue使用区别:
#include <stdio.h>
//代码1:for中的break
//输出结果为1 2 3 4
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
//代码2:for中的continue
//输出结果为1 2 3 4 6 7 8 9 10
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
3.2.3 for语句的循环控制变量
1.不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
示例 如下:中的i值属于半开半闭区间“0 =< x < 10”,起点到终点的间隔为N,循环次数为N;
代码2中的i值属于闭区间“0 =< x <= 10-1”,起点到终点的间隔为10-1,循环次数为N。
//代码1:前闭后开的写法
int i = 0;:
for(i=0; i<10; i++)
{}
//代码2:两边都是闭区间
for(i=0; i<=9; i++)
{}
3.3 break语句和continue语句的区别
continue语句只是结束本次循环,而不是终止整个循环执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
3.4 do...while()循环
在控制表达式被第一次计算之前,先执行指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0(“假”)为止,此时循环结束。与 while 和 for 循环不同,do...while 循环会确保循环体语句至少执行一次。
3.4.1 do语句的语法:
do
循环语句;
while(表达式);
其中的“循环语句”就是循环体。
3.4.2 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\\n", i);
}
while(i<10);
return 0;
}
4.goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 来说goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程,例如一次跳出两层或多层循环。 这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
5.几种循环的比较
(1)3种循环都可以用来处理同一问题,一般情况下它们是可以相互代替的;
(2)在while循环和do…while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使使循环趋于结束的语句(如i++,或i=i+1等)。
for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。
(3)用while和do…while循环时,循环变量初识化的操作应在while和do…while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
(4)while循环、do…while循环和for循环都可以用break语句跳出循环,用continue语句结束本次循环。
写在最后,创作不易,你们的支持是我最大的动力!如有不足之处,希望在评论区指正!!!
以上是关于分支语句和循环语句的主要内容,如果未能解决你的问题,请参考以下文章