C语言中可以把语句分为以下五类:
- (1):表达式语句; eg------> 3 + 5;
- (2):函数调用语句;eg------->printf(“hello world\n”);
- (3):控制语句;
- (4):复合语句;
- (5):空语句
咱们这一讲后面介绍的是控制语句哦!
定义:用于控制程序的执行,以实现程序的各种结构方式**(C语言中支持三种结构:顺序结构、选择结构、循环结构)**,它们由特定的语句定义符组成,C语言中有九种控制语句。
(1):条件判断语句(分支语句):if语句、switch语句。
(2):循环执行语句:do while语句、while语句、for语句。
(3):转向语句:break语句、goto语句、continue语句、return语句
选择语句中共有两种:(1)if语句 (2)switch语句。
在生活中,我们会面临各种各样的选择,譬如,如果你好好学习,高考时取得好成绩,拿到名校录取通知书,你的可选择面会宽广很多,否则,你只能去从事体力劳动,这就是选择!
#include
int main()
{
//语法结构1
if(表达式)
{
语句1;
语句2;
}
//语法结构2
if(表达式)
{
语句1;
语句2;
....
}
else
{
语句1;
语句2;
//语法结构3
if(表达式1)
{
语句1;
语句2;
....
}
else if(表达式2)
{
语句1;
语句2;
....
}
else
{
语句1;
语句2;
....
}
}
}
可能家人们对这里的else和else if有些不理解,咱们通过几段代码来具体讲解下!!
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
return 0;
}
先看这段代码,在这里输入一个年龄值,如果age的大小小于18则会在屏幕打印未成年,也就是说当age<18这个表达式的值为真时,就会执行里面的打印语句。博主在这里输入的15,15小于18,因此条件成立,则会在屏幕打印未成年。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}
与代码1不同的是,博主在这里多加了个else语句,那这里的else是什么意思呢?是这样字滴,在这里输入一个年龄值,如果年龄值小于18这个表达式为真,则执行if里面的代码块,将不执行else的代码块,如果年龄值小于18这个表达式为假,则执行else里面的代码块。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int age;
scanf("%d", &age);
if (age < 18)
{
printf("青少年\n");
}
/*这里不能写成 18< age <28,因为是从左向右执行,假设age == 5,age > 18这个表达式的值为假,为假则为0,0 < 28这个表达式的值为真,因此条件成立;
*/
else if (age >= 18 && age < 28)
{
printf("青年\n");
}
else if (age >= 28 && age < 40)
{
printf("中年\n");
}
else if (age >= 40 && age < 60)
{
printf("壮年\n");
}
else if (age >= 60 && age <= 100)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
与代码1和代码2不同的是,代码3又多了else if语句,那是什么意思呢,在if语句中,if 与 else if 以及 else语句三者为一体且为递进关系并且从上往下依次执行,什么意思呢?,譬如在代码3中,输入一个年龄值,如果age < 18这个表达式为真,则执行if里面的代码块,那么后面的else if 以及else将不再执行,直接跳过。如果age < 18这个表达式的值为假,则会进入到第一个else if进行判断,如果age >= 18 && age < 28这个表达式的值为真,则执行第一个else if里面的代码块后面的代码将不再执行;为假的话,那么进入到第二个else if进行判断。依此类推,如果说 age的值既不满足if语句的判断条件也不满足剩下的else if里面的判断条件,则执行else语句里面的代码块。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("hello world\n");
return 0;
}
咱们看这段代码,很多小伙伴会认为这里会在屏幕上打印hello world,因为刚刚博主讲了嘛,if语句里面的表达式,为假的话,那么就执行else语句里面的代码块,那么到底是不是呢,咱们运行下看看。
咱们可以看到,博主运行这段代码,屏幕上什么都没打印,这与家人们的预想不对啊,家人们会想,肯定是博主讲错了,哈哈,其实是这样的,else在匹配的时候有个规则,就是一般会匹配它离得最近的if语句,也就是说,这里的else语句匹配的是括号里面的表达式为b == 2 的if语句。这里a == 1 这个表达式的值为假,因此不进入第二层的if判断,直接跳过,所以在屏幕上什么都不打印滴。有的小伙伴们就在想,博主为什么这里代码要这么写呢?直接把else和第二个if语句对齐不就好了嘛。是这样滴,博主这么写,一方面要给家人们讲解下这个悬空else的知识,另外一方面就是要告诉家人们,咱们在写代码的时候,要形成良好的代码风格,譬如适当地缩进,以及if跟多条语句时要用{}框起来等等,给看代码的人,有一种一目了然的感觉。
刚刚博主讲了分支语句中的if语句,接下来博主将详细讲解分支语句中的第二种语句-----switch语句
#include
int main()
{
switch(整型表达式)
{
/*为一些case语句,
例如: case 整型常量表达式:
语句项*/
语句项;
}
return 0;
}
可能家人们对这里的语法形式还有些模糊,接下来博主将通过一段代码来具体讲解下。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("Weekday");
break;
case 6:
case 7:
printf("Weekend");
break;
}
return 0;
}
现在博主想实现这样一种功能,当我输入1-5这五个数字中的任意一个时,屏幕上将打印Weekday,当输入6或者7时,屏幕上将打印Weekend。这个时候就要用到咱们的switch语句来实现这种多分支的功能,switch语句后面的整型表达式博主放入的是day这个变量,当博主输入值的时候,就会对应地去匹配,然后执行case后面的语句项。
可能有的uu们对语句项里面的break有些疑惑,接下来博主将具体讲解这个break的作用!
咱们先看以下两段代码,博主将通过以下两段代码来讲解break的作用。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("Weekday\n");
case 6:
case 7:
printf("Weekend\n");
}
return 0;
}
uu们可能对这个运行结果有些疑惑,明明输入的是5,应该只在屏幕上打印weekday呀,为什么还会打印
weekend呢?那咱们再看最初的那个含有break的那段代码。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
相信uu们通过对比这两段代码,应该对这个break有了一定的初步印象。switch语句中的break是用来结束分支语句的判断(把语句列表划分为不同的分支部分),若不加break的话就会持续输出(即从满足判断的节点条件依次往下开始全部执行,直至遇到break)所以这也是为什么在第一段代码输入5的时候,会打印weekend的原因,因为先从case 5 那个节点开始执行,执行完以后没有遇到break,因此会继续向下执行。所以在使用switch语句的时候,要记得使用break哦,不然没办法直接实现分支,搭配使用break才能实现真正的分支哦!
有些uu们可能在想,如果我输入的值与case语句后面的值不匹配咋办呢?其实也没什么,结果就是所有的语句都被跳过而已啦,但是如果不想忽略不匹配所有case语句的表达式的值时该怎么办呢,这个时候就可以在语句列表中增加一条default子句。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("Weekday\n");
break;
case 6:
case 7:
printf("Weekend\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
咱们看这段代码,当输入除1-7以外的值时,就会执行default里面的语句,例如博主在这里输入9,此时屏幕上就会打印输入错误。这里博主建议uu们在使用switch语句时,除了在case语句后面加上break以外,在每个switch语句都放一条default子句甚至在default子句后面加上break,这也是个良好的编程习惯哦!
(1):while循环
(2):for循环
(3):do while循环
相信uu们已经掌握了if语句,当条件满足的情况下,if语句后的语句执行,否则不执行,**但是这个语句只会执行一次。**但我们在生活中有很多的事情需要重复不断地去做,那我们应该怎么做呢? C语言中给我们引入了while语句,可以实现循环。
#include
int main()
{
//跟在循环语句后面的{}里面的代码这一个整体称为循环体
//若表达式为真则执行循环体里面的循环语句。
while(表达式)
{
循环语句;
}
}
可能uu们对while循环还是有一点点小疑惑,接下来博主将通过这段代码来具体讲解。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
这段代码的功能是在屏幕上打印1-10的数字,这里博主就使用了while循环,而进入循环体的条件是i <= 10这个表达式的值为真,为什么是i <= 10呢?因为我的要求只是打印1-10,并且每次打印后,我的变量 i 还要进行变化,不然的话,就会成为了死循环。
上面的代码已经帮uu们了解了while语句的基本用法,那么接下来再了解下while循环中break和continue,首先先讲解break语句,我们将通过一段代码来具体讲解。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
if (5 == i)
{
break;
}
i = i + 1;
}
return 0;
}
这段代码的输出结果是1 2 3 4 5,那么是为什么呢?核心就在于这个break,在循环中,只要遇到break,就会停止后期的所有的循环,直接终止循环,因此while循环中的break是用于永久终止循环的,当变量 i 的值为1的时候,此时判断循环条件,进入循环体,打印数字1,然后不满足if条件的判断,依次类推,当变量 i 的值为5的时候,此时先打印数字5,然后此时 5 == i这个表达式的值为真,进入判断,执行break语句,此时跳出整个循环,直接到达了return 0这个语句。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (5 == i)
{
continue;
}
printf("%d ", i);
}
return 0;
}
这段代码的执行结果为什么是这样子的呢?核心就在与这个continue,continue在循环语句中是用于终止本次循环的,也就是说本次循环中continue的后边的代码将不会再执行,而是直接跳转到了while语句的判断部分。进行下一次循环的入口判断。当变量 i 的值为4的时候,此时进入循环体,变量 i 先加1,此时变量 i 的值为5,那么if语句后面的表达式的值为真,此时就会continue跳过本次循环,因此后面的printf语句将不再执行,直接回到判断部分, 5 <= 10这个表达式成立,因此进入循环,变量 i 再进行 + 1,此时变量 i的值为6,不满足if语句后面的条件判断,此时将打印数值6,周而复始,直到循环结束。
讲解完while循环之后,接下来,博主将详细讲解循环语句中的第二种,for循环。
#include
int main()
{
for(表达式1;表达式2;表达式3)
{
循环语句;
}
}
(1):表达式1为初始化部分,用于初始化循环变量。
(2):表达式2为条件判断部分,用于判断循环什么时候终止。
(3):表达式3为调整部分,用于循环条件的调整。
可能uu们对for循环还是有些迷惑,接下来博主将通过一段代码来具体讲解下。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 0;
//i = 1为初始化部分; i <= 为判断部分; i++为调整部分
for (i = 1; i <= 10;i++)
{
printf("%d ", i);
}
return 0;
}
这里博主使用了for循环来打印1-10这10个数字,执行过程是这样子的
(1):首先将变量 i 初始化为1
(2):然后进入判断部分,此时 i <= 10这个表达式为真,因此进入循环体,然后打印 i
(3):接着进入调整部分,变量 i 进行+1,此时变量i 的值为2。
(4):接着再进入判断部分,此时 i <= 这个表达式为真,进入循环体。
周而复始,知道 i <= 10这个表达式为假时,跳出循环。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
//初始化部分
int i = 1;
//判断部分
while (i <= 10)
{
printf("%d ", i);
//调整部分
i++;
}
for (i = 1; i <= 10;i++)
{
printf("%d ", i);
}
return 0;
}
我们可以对比一下for循环和while循环,会发现while循环中依然存在循环的三个必须条件,但是由于代码风格的问题使得三个部分偏离较远,这样在查找修改就不够集中和方便。因此,for循环的风格要更胜一筹;for循环使用的频率也最高。
前面在while循环中有break,那么在for循环中也同样存在,并且作用相同,用于永久终止循环。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 0;
for (i = 1; i <= 10;i++)
{
printf("%d ", i);
if (i == 5)
break;
}
return 0;
}
当变量 i 的值为5的时候,此时就会break跳出整个循环,因此在屏幕上只会打印1-5这5个数字
while中的continue是跳过本次循环,不执行continue后面的代码,直接回到循环的判断部分,那么在for循环中是不是也是如此呢?我们看如下代码
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 0;
for (i = 1; i <= 10;i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
我们可以看到,屏幕上除了5以外,其他的数字都打印了,原因是这样子的:在for循环中的continue也是跳过本次循环,不执行continue后面的代码,但是不是回到循环的判断部分,而是回到循环的调整部分,这里和while循环有差异,因此在变量i为5的时候,此时跳过本次循环,回到调整部分i++,然后再进入判断部分。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
for (; ;)
{
printf("hello world\n");
}
return 0;
}
for循环中的初始化部分,判断部分,调整部分是可以省略的,初始化部分和调整部分省略就相当于啥事都没做,而省略判断部分,此时恒为真,将陷入死循环。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 0;
for (i = 1; i<= 10; i++)
{
i = 6;
printf("%d ",i);
}
return 0;
}
不可在for循环体内修改循环变量,因为这样很容易导致死循环!
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i< 10; i++)
{
for (int j = 0; j < 10; j++)
{
printf("hello world\n");
count++;
}
}
printf("%d", count);
return 0;
}
我们会发现,这里打印了100次hello world,原因是这样子滴:当for循环嵌套时,会先执行完内部的for循环,然后执行结束以后,再回到外层循环的调整部分,接着再进入判断部分,然后执行第二次外层循环,因此这里就会打印 10 * 10 = 100次的hello world。
讲完了两种循环语句,接下来讲最后一种循环语句-----do…while语句,与前面两种循环语句不同的是,do…while循环有个特点:循环至少执行一次。
#include
int main()
{
do
{
循环语句;
}
while(表达式);
}
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
咱们看这段代码,首先会执行一次循环体即先打印一次变量 i 的值,然后对i进行自增,最后再进入到判断部分,此时进入判断时,i 的值为2。周而复始,直到循环结束。
do…while循环中的break与前面两种循环的break的作用一样,都是用于永久终止循环滴。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 1;
do
{
printf("%d ", i);
if (5 == i)
{
break;
}
i++;
} while (i <= 10);
return 0;
}
do…while循环中的continue和while循环中的continue作用一样,都是跳过本次循环,不再执行continue后面的代码,回到循环的判断部分。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i = 1;
do
{
i++;
if (5 == i)
{
continue;
}
printf("%d ", i);
} while (i <= 10);
return 0;
}
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上讲goto语句是没有必要的,实践中没有goto
语句也可以很简单地写出代码。但是在某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内存循环退出到上一层的循环。
#include
int main()
{
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//处理错误情况
if(disaster)
}
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
again:
printf("hehe\n");
printf("hehe\n");
//goto语句会跳转到again的地方去
goto again;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
/*1:电脑运行起来后,一分钟之内关机
2:如果输入:我是猪,就取消关机*/
#include
//使用strcmp函数必须导入的头文件
#include
int main()
{
char input[20] = { 0 };
/*system函数
功能:在已经运行的程序中执行另外一个外部程序
参数:外部间可执行程序名字
返回值:成功:0
失败:任意数字*/
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在60s内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
/*比较两个字符串是否相等不可以使用==,而应该使用一个库函数strcmp函数
如果返回值为0,则说明两个字符串相等*/
if (strcmp(input, "我是猪") == 0)
{
//取消关机
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
这段代码是使用goto语句写的一个小关机程序,博主在代码中写了详细的注释方便uu们理解!
好啦,关于分支循环语句的详细讲解就到这里啦!如果uu们觉得博主讲的不错的话,请动动你们滴滴给博主点个赞,你们滴鼓励将成为博主源源不断滴动力!