Hello~我是芝士,前面的文章中给大家介绍了一些C语言初识篇的内容,对C语言的一些基本的语法以及程序的书写有了初步认识,后面给大家分享C语言语句篇,本篇分享C语言的分支语句
。
目录
关于C语言中的语句,这里进行一个简单的介绍。C语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
今天要介绍的是C语言的控制语句中的分支语句。关于控制语句可以分为以下三大类:
- 分支语句(条件判断语句):if语句、switch语句
- 循环语句:while 语句、do while 语句、for语句
- 转向语句:break语句、goto语句、continue语句、return语句
1. if 语句
if 语句的介绍主要分为以下几个模块:
1.1 语法形式
if 语句也是选择语句,我们在进行选择的时候有单项选择、两项选择以及多项选择,在进行两项以及多项选择时通常会与else连用
,构成if...else
语句结构,具体的语法结构如下:
1. 单项选择结构
if(表达式)
执行语句;
注:只有if里面的表达式判断为真(非零),才会对语句进行执行,否则没有输出。
2. 两项选择结构
if(表达式)
执行语句1;
else
执行语句2;
注:当if里面的表达式判断为真(非零),语句1进行执行,否则执行else的语句2。
3. 多项选择结构(这里以三项为例)
if (表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
注:当if里面的表达式1判断为真(非零),执行语句1,
否则对else if的表达式2进行判断,为真执行语句2,
表达式1和2都为假,执行语句3。
下面用具体的程序进行测试:
#include <stdio.h>
int main()
{
int a = 10;
//单项选择结构
if (a !=0)
{
printf("Hello world\n");
}
//两项选择结构
if (a == 0)
{
printf("a的值为0\n");
}
else
{
printf("a的值不为0\n");
}
//多项选择结构
if (a ==0)
{
printf("a的值为0\n");
}
else if (a == 1)
{
printf("a的值为1\n");
}
else
{
printf("a的值不为0也不为1");
}
return 0;
}
得到输出结果:
Hello world
a的值不为0
a的值不为0也不为1
从以上程序代码中我们发现有一个{ }
符号也叫做代码块
,这是分支语句的组成部分之一。当要执行多条语句时,适当的使用{ }可以使代码的逻辑更加清楚
,具体的理解我们后面进行详细介绍。
1.2 else使用
我们在实际运用时,常常涉及到两个及两个以上的分支选择,因此else的配合使用能够帮助我们实现更多功能。
1.2.1 悬空else
上面的程序我们简单地体验了else的使用,else不仅仅能够与if构成if...else语句,还能够与if构成else if 进行选择判断
。需要注意的是:如果有多个 if 和 else,else总是跟最接近的if进行匹配,这样的匹配原则也叫做悬空else问题。具体可以见下面代码:
#include <stdio.h>
int main()
{
int a = 1;
int b = -1;
if (a < 0)
if (b == -1)
printf("Hello world");
else
printf("Hello");
return 0;
}
输出结果
//输出结果为空
根据运行的结果,我们可以知道本质上else是与最近的if进行匹配的,即与if (b == -1)的if匹配。因为if (a < 0)为假,因此直接不进行进一步的判断。输出为空。
1.2.2代码块{ }
为了解决上面的悬空else问题,我们可以用{ }代码块进行逻辑的梳理
。代码修改如下所示:
#include <stdio.h>
int main()
{
int a = 1;
int b = -1;
if (a < 0)
{
if (b == -1)
{
printf("Hello world");
}
}
else
{
printf("Hello");
}
return 0;
}
输出结果
Hello
因此,我们可以带上适当的⼤括号,代码的逻辑就会更加的清晰。
1.2.3 else if
前面提到 else不仅仅能够与if构成if…else语句,else 可以与另⼀个 if 语句连⽤,构成多重判断——else if也叫做嵌套if
。举个例子:要求输⼊⼀个整数,判断输入的整数是0,正数或者负数。按照if…else语句书写代码如下:
int main()
{
int i = 0;//初始化
printf("请输入一个数: ");
scanf("%d", &i);
if (i>0)
{
printf("输入的数字是正数");
}
else
{
if (i <0)
{
printf("输入的数字是负数");
}
else
{
printf("输入的数字是0");
}
}
return 0;
}
这段代码的结构可以这样看:
不难发现橙色框线部分的稍微有些复杂不够简洁,因此我们可以对代码进行修改,在不改变其逻辑的情况下简化代码,这里就是用到else if,修改后的代码如下:
#include <stdio.h>
int main()
{
int i = 0;//初始化
printf("请输入一个数: ");
scanf("%d", &i);
if (i>0)
{
printf("输入的数字是正数");
}
else if (i <0)
printf("输入的数字是负数");
else
printf("输入的数字是0");
return 0;
}
下图中蓝色背景的代码就是嵌套在前面的 else ⼦句中的,构成了嵌套的if语句
2. switch语句
分支语句的另一个就是switch
,常常用于多分支
的情况。
2.1 语法形式
switch 语句是一种特殊形式的if…else结构,它能够将多重的else if改成更加简洁和可读的模式。其语法规则如下:
switch (整型表达式)
{
case 整形常量表达式:
执行语句1;
case 整形常量表达式:
执行语句2;
......
default:
执行语句;
}
这个语法结构的意思是,程序执行起来后,根据表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀
。
需要特别注意:
- switch后的表达式必须是整型表达式;
- case后的值必须是整型常量表达式
关于这两个表达式,我们通过下面例子中程序进行理解:
//键盘上输入数字,输出对应的星期
#include <stdio.h>
int main()
{
int day = 0;//初始化变量day
printf("请输入星期数字:");
scanf("%d", &day);
switch (day)
{
case 1:
printf("今天是星期一");
break;
case 2:
printf("今天是星期二");
break;
case 3:
printf("今天是星期三");
break;
case 4:
printf("今天是星期四");
break;
case 5:
printf("今天是星期五");
break;
case 6:
printf("今天是星期六");
break;
case 7:
printf("今天是星期天");
break;
default:
printf("请输入1~7的整数");
break;
}
return 0;
}
由于switch语句中,没办法直接实现分支,搭配break
使用才能实现真正的分支。根据上面的程序我们可以知道 day 就是一个整型表达式
,case后面的具体数值就是整型常量表达式
。switch语句的运行机制
就是:根据其整型表达式进入语句内,然后根据case整型常量表达式的值匹配相应的执行语句,break起到跳出switch语句的作用
,default在整型表达式与常量表达式的值没有相匹配的时候执行
。关于这里面的break和default我们接下来进行详细介绍。
2.2 switch中的break
前面讲到,break在switch中的起到跳出作用。如果面的程序中没有break,那么switch语句就构成不了分支作用,具体见下面代码:
#include <stdio.h>
int main()
{
int day = 0;
printf("请输入工作日星期数字: ");
scanf("%d", &day);
switch (day)
{
case 1:
printf("今天是星期一\n");
case 2:
printf("今天是星期二\n");
case 3:
printf("今天是星期三\n");
case 4:
printf("今天是星期四\n");
case 5:
printf("今天是星期五\n");
default:
printf("请输入1~5数字");
}
return 0;
}
这里输入数字3,得到输出结果:
可以发现case 3 后面的执行语句都输出了,因此break的作用不言而喻了。出现这一情况的愿意是:switch 语句是分⽀效果,但只有在 switch 语句中使用 break才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,直到遇到 break 语句或者 switch 语句结束
。
2.2 switch中的default
在使⽤ switch 语句的时候,如果switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。如果并不想忽略不匹配所有标签的表达式的值时,可以借助default子句进行提醒。
语法结构为:
default:
执行语句;
具体效果如下例子:输入1~5数字时,输出工作日,输入6和7,输出休息日。
#include <stdio.h>
int main()
{
int day = 0;
printf("请输入:");
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("请输入合适范围的数字");
break;
}
return 0;
}
当输入超出范围的数字,得到以下结果:
关于default字句的位置,在 switch 语句中 case 语句和 default 语句是没有顺序要求
,但根据写代码的逻辑我们通常把 default 子句放在最后处理。
3. if 和 switch 对比
if 语句和switch 语句都是分支语句,都能够进行分支选择,但是两者还是有不同之处。通过以下程序进行对比:
要求:输⼊任意⼀个整数值,计算除3之后的余数
if 语句实现
#include <stdio.h>
int main()
{
int num = 0;
printf("请输入一个数字:");
scanf("%d", &num);
if (num % 3 == 0)
{
printf("余数为0");
}
else if (num % 3 == 1)
{
printf("余数为1");
}
else
{
printf("余数为2");
}
return 0;
}
switch语句实现
#include <stdio.h>
int main()
{
int num = 0;
printf("请输入一个数字:");
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("余数为0");
break;
case 1:
printf("余数为1");
break;
case 2:
printf("余数为2");
break;
}
return 0;
}
对于以上两个语句的区别可以总结如下:
特征 | 区别 |
---|---|
判断条件类型 | if语句可以使用各种条件表达式,而switch语句只能使用整数或字符常量作为条件 |
用途 | if语句用于处理各种复杂的条件逻辑,而switch语句用于多个固定取值的情况下进行条件判断 |
可读性 | 当条件较为简单时,if语句易于理解,条件较复杂时可读性下降;而当存在多个固定值判断时,switch语句的可读性更高 |
性能 | 当条件较多时,if-else if-else 结构的性能较差,而switch语句因为使用跳转表结构,性能一般来说比较高 |
执行方式 | if语句从上至下依次匹配条件,符合条件则执行对应代码块;而switch语句根据条件值直接跳转到对应分支,不需要逐一匹配条件 |
我们在实际的编程中,选择使用if语句还是switch语句通常基于具体的条件逻辑和代码需求。
Ok~以上就是本次分享的所有内容啦,如果有书写不当之处还望批评指正 😃 ps(碎碎念)坚持复习的第三天,明天也要继续加油鸭🦆