哈喽!大家好,我是冰淇淋加点糖,今天继续讲解C语言中的分支语句和循环语句。话不多说,开始今天的正文啦!
C语言语句有五类,分别为表达式语句、函数调用语句、控制语句、复合语句和空语句。本节主要说明控制语句,用于控制程序的执行流程,以实现程序的结构方式(顺序结构、选择结构、循环结构),他们由特定的语句定义符组成
if(表达式)
语句1;
else if(表达式)
语句2;
else
语句3;
//上述是多分支,可以单独if语句,也可以两个分支if-else。
1.条件判断语句(分支语句):if、switch语句
2.循环执行语句:do while、while、for语句
3.转向语句:break、goto、continue、return语句
分支语句
if 表达式
语法结构如下:
if(表达式)
语句1;
else if(表达式)
语句2;
else
语句3;
上述是多分支表达式结构,可以单独if语句,也可以两个分支if-else语句。
#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");
}
return 0;
}
注意:
1.代码中加入{}可以让代码逻辑更清楚,一个{}表示一个代码块
2.else是和离它最近的if匹配.
3.注意区分下面两个判断
if (condition)
{
return x;
}
return y;//无论condition如何,都会执行return y;
if (condition)
{
return x;
}
else
{
return y;
}//只有condition为假才执行return y;
switch 表达式
switch 语句也是一种分支语句,常常用于多分支的情况。switch语句的语法结构如下:
switch (整型表达式)
{
语句项;
}
其中语句项为 case 语句:
例如:
case 整形常量表达式 :
注:char是字符类型,其本质是字符的ASCII值即是整数,该语句中也可以使用。
#include<stdio.h>
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;
default:
printf("0000\n");
break;
}
return 0;
}
上述代码中,当switch中的整型表达式与case匹配时,则输出对应的结果,并跳出该switch语句;如果case语句中没有匹配的,则匹配default语句,并跳出switch语句。
若我们需求是输入1-5,输出“weekday”;输入6-7,输出“weekend”。则代码如下:
#include<stdio.h>
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;
}
我们来看下面这段代码,深入了解一下switch语句的使用。
#include<stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
我们手动推演一下代码运行,最开始的时候n=1,m=2。运行switch(n)时,正好n=1匹配case1.则m++即此时m=3.而此时case1没有break语句,则无法退出switch语句,则会继续匹配候后续的case语句,直到遇到break子句退出switch语句为止。执行完case2,m=3,n=2。仍然没有break,则继续执行case3。case3为一个switch语句的嵌套,内执行switch(n),注意此时n=2.则这个子嵌套的switch语句中case1不匹配。嵌套switch语句的case2中,执行m++,n++然后遇到break语句退出子嵌套switch语句。此时m=4,n=3.然后回到第一个switch语句中执行case4,则m++。(此时m=5,n=3不变)后遇到break语句,说明退出整个switch语句。打印m和n的值最后为5和3.
程序运行结果如下:
循环语句
C语言中,循环语句有三种,分别为:1.while语句 2.for语句 3.do...while语句。
while 语句
while(表达式)
循环语句;
while 循环的执行流程如下:
while语句可以搭配break和continue使用:
1.break在while循环中的作用:在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。注:当有多层嵌套循环时,break只会跳出当前层循环,不会终止所有循环。
2. continue在while循环中的作用: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
输出结果如下,可见break跳出当前层循环,终止当前层循环。
对比如下两段还有continue的代码,更方便理解continue在while中的作用。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
这段程序的输出结果如下:
当i为5时,跳过continue后面的printf语句,进入while判断i<=10,然后继续执行后续语句。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
此段代码与上述代码只有i=i+1的顺序放置不一样,但是二者的结果天差地别。
这段代码进入了死循环,当i==5时,会进入if条件句进行判断,然后执行continue语句,而该语句是跳过本次循环直接进入while表达式判断,会发现i==5 <=10。while表达式为真,则会进入while循环,又进行第一条语句if的判断,所以说该代码则会一直进入死循环,反复判断if条件句,反复跳过当次循环。
#include<stdio.h>
int main()
{
//EOF - End Of File
//#define EOF (-1)
//函数读取失败的时候返回EOF
//scanf 函数读取成功返回的是读取到的数据个数,读到空格就停止,但是要回车才能确保输入成功
//读取失败返回EOF
//getchar 读取成功返回字符的ASCII码值
//读取失败返回EOF
//ctrl+Z 使得scanf和getchar返回EOF
//清理缓存区中的剩余数据
/*
while (getchar() != '\n'){;}
*/
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
for 循环
for(表达式1; 表达式2; 表达式3)
循环语句;
上述表达式的作用如下:
1.表达式1:初始化循环变量。
2.表达式2:循环条件的判断,判断循环何时终止。
3.表达式3:循环条件的调整。
for循环的循环逻辑如下:
break和continue在while循环和for循环中的意义是一样的,但是还是有差异。
break使用于for循环中
#include<stdio.h>
int main()
{
int i = 0;
for (int i = 0; i < 10; i++)
{
if (i == 5) break;
printf("%d ", i);
}
return 0;
}
continue使用于for循环中
#include<stdio.h>
int main()
{
int i = 0;
for (int i = 0; i < 10; i++)
{
if (i == 5) continue;
printf("%d ", i);
}
return 0;
}
运行结果如上,对比上文两段使用while循环搭配continue的代码可知,for循环中遇到continue,会跳过当次循环,并进行循环条件调整。
for 循环的变种
#include<stdio.h>
int main()
{
//初始化和调整部分省略就是啥都不做
//判断部分省略了,意味着判断是恒为真的
for (;;)
printf("hehe\n");//死循环
return 0;
}
#include<stdio.h>
int main()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
printf("hehe\n");//打印4*4=16个hehe
}
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 4; i++)
{
for (; j < 4; j++)
{
printf("hehe\n");
}
}
return 0;
}
上述第三个代码,不要初始化条件,最后的结果是输出四个hehe。
当i=0<4时,进入第一层for循环,然后遇到第二个for循环此时j最开始定义的是0,符合循环条件,打印hehe,以此类推,直到j=4的时候已经打印了四个hehe,此时不满足第二层for循环的循环条件,退出第二层循环。重新回到第一层for循环,此时i变为1,又来到第二层for循环,由于for循环没有重新初始化j=0;它仍保留上一次循环留下的j=4,所以不满足第二层for循环的条件,即不打印hehe,又返回第一层循环,直到第一层循环i=4不满足循环条件,循环结束。所以这个程序的运行结果是打印四个hehe。
do...while 循环
do...while()循环 至少会循环一次。该循环是先执行do语句中的代码,再进入while判断条件是否满足。这是与while循环的不同点。
do
循环语句;
while(表达式);
do...while()语句的执行流程如下图:
goto语句
goto语句又称无条件转移语句,作用是让程序的执行流程从当前位置跳转到同一函数内的另一个位置,这个位置由一个标签(label)来标识。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
#include<stdio.h>
int main()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
for (int k = 0; k < 5; k++)
{
if (k == 2) goto out;
printf("程序正常运行中\n");
}
}
}
out:
printf("哈哈,我是美女!\n");
return 0;
}
上述程序运行到k==2时,执行goto语句,跳转到out标签,直接退出了三层循环嵌套。
注:1. goto语句是一个关键字,不是一个函数,不需要包含头文件。
2. goto 语句只能在一个函数内部跳转,不能跨函数跳转。