前面介绍了初识C语言相关内容,这篇博客开始将正式对C语言的每一个章节进行深入学习,这篇主要讲解分支语句和循环语句!!!
本篇博客所学习的分支语句和循环语句主要依附于控制语句,所以何为控制语句?
用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,
C
语言有九种控制语句,可分成以下三类:
条件判断语句也叫分支语句:
if
语句、
switch
语句;
循环执行语句:
do while
语句、
while
语句、
for
语句;
转向语句:
break
语句、
goto
语句、
continue
语句、
return
语句。
分支语句(选择结构)
前面初识C语言中我们举过这样一个例子,好好学习就可以拿一个好offer,摆烂的话你就得回家种地,这就是一种选择,不同的选择就会有不同的结果,在C语言中,这种不同的结果则会对应执行不同的语句(或代码块)。
今天让我们一起来学习两种分支语句:if语句和switch语句。
if语句
if语句的语法结构
语法结构:1. if
(
表达式
)
语句
;2.
if
(表达式
)
语句
1
;else
语句
2
;3.
//
多分支if
(
表达式
1
)
语句
1
;else if
(
表达式
2
)
语句
2
;else
语句
3
;
代码示例分别如下:
1.
2.
3.
注意:其中在写else if中的条件时,一定要用&&这个操作符,假设你写成(18<age<30),此时程序的执行过程是18如果<age,左边就会为真,此时18<age的运算结果就会为1(C语言默认的为1),然后再去执行1<30这个语句。
如果条件成立,要执行多条语句,应该使用代码块。
此时编译会发生错误,因为执行多条语句时,应使用大括号,改正如下:
以后在敲代码时,应该养成这种习惯,不管是一条语句还是多条语句,我们都要带上大括号,这样不仅不会出现错误,而且会增加我们的代码在逻辑上的可读性。
悬空else
我们一起来考虑一下这个代码的运行结果,大部分人可能都会这么想a = 0,不满足第一个if条件,则会执行与其对应的else里面的语句打印出haha,让我们一起来看一下编译结果:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0; }
结果什么也没有输出,这是为什么呢?当出现这种悬空的else时,首先匹配距离其最近的if,所以这里的else与第二个if匹配,当不满足第一个if的条件时会直接退出程序。这个例子也更加证明前面提到的书写大括号这个习惯的重要性!
改正如下:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
若加上大括号,此时结果就会输出haha。
switch语句
前面的例子当我们遇到多个条件时,会一直重复书写else if,为了避免这种复杂形式我们就会采用switch语句。
switch语句的语法结构
switch
(
整型常量表达式
){
语句项;}语句项://
是一些
case
语句://
如下:case
整形常量表达式
:
语句
;
switch语句中的break
switch
语句中,我们没办法直接实现分支,搭配
break
使用才能实现真正的分支,执行完某个case语句后,我们一般采用break语句跳出switch达到分支的作用。
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
有时候我们的需求变了:
输入
1-5
,输出的是
“weekday”;
输入
6-7
,输出
“weekend”
default子句
case
标签可以出现的位置。
switch
表达式的值并不匹配所有
case
标签的值时,这个
default
子句后面的语句就会执行。
switch
语句中只能出现一条
default
子句。
case
标签一样执行
default
子句。
#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;
}
答案:m = 5,n = 3,自行考虑!
小练习2:
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
此时fun(1) = ?
答案为:0;
注意:在没有break语句中跳出switch时,switch中的任何语句都需要执行(包括default语句),其中default与case语句没有先后顺序。
循环语句
C语言中我们主要学习三个循环,分别为:while 循环for 循环do while 循环
我们都知道if语句,满足条件时会执行,否则不执行,但是整个语句只能执行一次;由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
while语法结构
while
(
表达式
)循环语句
;
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
我们只需要在while的判断语句中加上条件,然后每次打印后让i++就可以了。
while语句中的break和continue
break
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
此时结果为1 2 3 4,i=5时执行break语句会跳出循环,所以break的作用就是跳出整个循环,是永久的。
continue
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
此时结果为1 2 3 4后面死循环,是因为continue只是跳出本次循环后面的语句,直接跳转到while语句的判断部分,进行下一次循环的入口判断。
//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
该编译结果自行理解。
总结:
continue在while循环中的作用就是:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
for循环
for循环语法
for
(
表达式
1
;
表达式
2
;
表达式
3
)循环语句
;表达式
1表达式
1
为
初始化部分
,用于初始化循环变量的。表达式
2表达式
2
为
条件判断部分
,用于判断循环时候终止。表达式
3表达式
3
为
调整部分
,用于循环条件的调整。
类比于前面的while循环,我们都知道使用while循环时,需要先定义一个初始变量,然后while的括号需要写入判断条件,出while循环时也需要写调整语句;那么同样for循环也需要,只不过for循环把这三个部分的语句整合在了一个括号内。 那我们如何用for循环在屏幕上打印1-10的数字呢?如下:
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
其中for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
对比for循环和while循环
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++) {
printf("hehe\n");
}
for循环中的break和continue
break
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
结果为1 2 3 4,i= 5时遇到break语句直接跳出循环,所以break的作用就是跳出整个循环,是永久的。
continue
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
此时结果为1-10没有5,同while循环不同是因为i=5时,continue会跳过后面的代码,但是i++语句并没有跳过,所以i++之后=6进入for循环继续执行打印操作。
for循环书写建议
1.
不可在
for
循环体内修改循环变量,防止
for
循环失去控制。2.
建议
for
语句的循环控制变量的取值采用
“
前闭后开区间
”
写法。
1.示例:
此时编译会出现死循环是因为在for循环体内加了一句i=0这个控制语句,造成每次进入循环时i始终等于1,所以不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2.
int
i
=
0
;//
前闭后开的写法for
(
i
=
0
;
i
<
10
;
i
++
){}//
两边都是闭区间for
(
i
=
0
;
i
<=
9
;
i
++
){}第一种写法更容易看出需要循环10次,逻辑上更容易被理解
一些for循环的变种
1.
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题。
因为没有控制语句,会默认for循环的判断语句恒成立,此时会死循环打印hehe,故写for循环时最好不要省略。
2.
1.
int main()
{
int i = 0;
int j = 0;
//这里打印多少个hehe?
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
2.
int mian()
{
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
来比较两个代码,分别会打印多少个呵呵?
第一个代码打印了9个hehe,因为外面三次循环,里面三次循环,所以一共3*3 = 9次循环,故打印9次hehe;
第二个代码为什么只打印了三个hehe呢?那是因为当i= 0进入第二个for循环时,内层循环j会一直++,当j=3时退出内层循环打印了三个hehe,但是此时j=3,当i++等于1时,j=3不满足第二个for循环的条件不会进入内层循环,故只打印了三个hehe。所以我们在书写代码时尽量不要省略初始条件!!!
do…while循环
do语句的语法
do循环语句
;while
(
表达式
);
do语句的特点
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
虽然此时i=10不满足while里面的条件,但是do语句的特点至少执行一次,故输出10。
do while循环中的break和continue
break
int main()
{
int i = 10;
do
{
if (5 == i)
break;
printf("%d\n", i);
} while (i < 10);
return 0;
}
continue
int main()
{
int i = 10;
do
{
if (5 == i)
continue;
printf("%d\n", i);
} while (i < 10);
return 0;
}
从编译结果可以看出,break和continue的结果都是10(同while语句类似),读者自行理解,不做过多赘述 。
狂肝将近6000字,希望读者可以耐心看完,那么循环和分支语句的介绍到这里,后面我会出一篇关于本章的相关题目以加强读者的理解,然后我们就得开启函数学习的篇章了,烦请点个关注和收藏,我们一起继续努力,加油!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89471.html