前言:C语句分为以下五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
本文之后所介绍的属于控制语句。
目录:
一.分支语句(条件判断语句)
1.1:if语句
1.2:switch语句
二.循环执行语句
2.1:while语句
2.2:for语句
2.3:do while语句
1.1 if语句
语法结构:
//结构1
if (表达式)
语句;
//结构2
if (表达式)
语句1;
else
语句2;
//多分支
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
默认每次if/else if/else只能输出一条语句,若需要输出多条语句,必须要使用大括号"{}"括起来
//输出多条语句
if (表达式1) {
语句1;
语句2;
}
else
语句1;
那语句应该如何执行呢?
当表达式的结果为真时,语句执行
在C语言中如何表示真假?
0表示真,非0表示假
接下来举个简单的例子:
int age = 0;
scanf("%d", &age);//从控制台输入岁数
if (age < 18)
printf("未成年\n");
else if (age >= 18)
printf("成年\n");
假如我们输出的是小于18的数,则会打印未成年三个字,反之,则会打出成年。
接下来讲述一些if语句中容易出现的问题
1.1.1 悬空else
//以下的代码会怎样打印呢?
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("输出1\n");
else
printf("输出2\n");
return 0;
上述的代码的答案是:什么都不会输出
因为else的匹配是有个原则的:else是和离它最近的if匹配的
若想要正常输出,应修改为:
//修改后会打印出 输出2
int a = 0;
int b = 2;
if (a == 1) {
if (b == 2) {
printf("输出1\n");
}
}
else {
printf("输出2\n");
}
可见适当使用{}可以使代码逻辑更加清晰,所以一般建议无论输出1条或者以上一句都带上{}
1.2 switch语句(常用于多分支)
switch (整形表达式) {
case 整形常量表达式:
语句;
}
在swicth语句中,如果没有break没办法直接实现分支,所以一般搭配break使用
比如:
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;
}
上述代码输入相应的数字,就能输出相应语句。
那么一定要使用break才行吗?
是否使用break得根据情况来决定,若前面条件输出的语句相同,则可以在最后使用break
如:
int day = 0;
scanf("%d", day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末\n");
break;
}
在上述代码中输入1~5后输出的语句相同,输入6~7后输出的语句相同。因为是你选择的case从上往下执行的,所以case中有语句却没break的话会继续往下执行,若在case3中添加个break,则1~3为一部分,4~5为一部分,6~7为一部分。
所以:break语句的实际效果是把语句列表划分为不同的分支部分
1.2.1 default子句
如果表达的值与所有case标签的值不匹配怎么办,这时候default的作用就出来了
switch (整形表达式) {
case 整形常量表达式:
语句;
default:
语句;
}
如果表达的值与case标签的值不匹配,则会执行default中的语句
一般即使switch语句中不加default也不会出现错误,但建议每个switch语句中都放一条default子句,default中也可以加break;
2.1 while语句
//while 语法结构
while (表达式)
循环语句;
while语句执行的流程:
比如:
//在屏幕打印1-10数字
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
同样,break和continue也在while语句中有着相应作用
while中的break是用于永久终止循环的
while中的continue是用于终止本次循环,而直接跳转到while语句的判断部分,进行下一次的入口判断
2.2 for循环
for循环可以说是三种循环中用得最多,泛用性最高的循环语句
for (表达式1; 表达式2; 表达式3) {
循环语句;
}
表达式1:初始化部分,用于初始化循环变量的
表达式2:条件判断部分,用于判断循环时候终止
表达式3:调整部分,用于循环条件的调整
比如:
//打印数字1-10
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
执行流程图为:
for循环中的break和continue意义与while是一样的,所以不再赘述
PS:for的三个条件可以都可以省略,如for(;;),但不建议,容易导致问题。
2.3 do while语句
语句结构:
do {
循环语句;
}
while (表达式);
执行流程图:
与while和for不通的是,while和for是先判断在执行。而do while是不管表达式真假,先执行一次语句再判断表达式的真假,若真则继续执行,假结束
如:
//打印数字1-10
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
break和continue与上述的意义相同
需要注意的是,上述五个语句中所执行的语句,若没{}则默认只执行一条,即使多条也不执行,会报错,所以建议不管一条还是多条,都建议用{}括起来