C语言-分支语句

1、什么是语句?

C语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句
    控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
    可分成以下三类:
  6. 条件判断语句也叫分支语句:if语句、switch语句;
  7. 循环执行语句:do while语句、while语句、for语句;
  8. 转向语句:break语句、goto语句、continue语句、return语句。

2、分支语句(选择结构)

如何理解分支语句呢,这里我画了一个简图来帮助理解
在这里插入图片描述

这里我们可以看到,读大学这里是一个选择的结点,当你选择好好学习时,你在毕业时将会找到一个好工作,而当你选择在宿舍摆烂时,你会找不到好工作。通过这个例子我们了解了什么是选择结构。

2.1.if语句

if语句是选择结构里的控制语句,也就是说,通过if语句可以实现选择的控制功能
if的语法结构如下

//两条分支
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;
    
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

接下来,我们通过代码去深入理解一下if语句的功能以及结构。

2.1.1悬空else

先看代码:

#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语句还是第二个if语句。
这里涉及一个知识点:

else的匹配:else是和它离的最近的if匹配的

也就是说这个代码其实长这样:

#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; }

这里可以告诉我们两个点:
第一个点:我们在写程序的时候不要图省事而不用{},但事实上,适当的使用{}可以让我们的代码看起来更容易理解,不容易让别人看我们的代码时产生歧义。
第二个点:我们在学习写代码的时候应该注意培养我们的代码风格。

2.1.2 if书写形式怎么样优化

先看以下代码:

//代码1
if (condition) {
    return x; 
 }
return y;
//代码2
if(condition) 
{
    return x; 
 }
else
{
 return y;
}
//代码3
int num = 1;
if(num == 5) 
{
    printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num) {
    printf("hehe\n");
}

这里我们可以直观看到代码2要比代码1显得更加清晰,而这里代码3实际上也要比代码4要好。原因是:if语句里面5 == num要比写成 num
== 5好。因为当你不小心把 == 符号写成 = 符号时,如果你写成5 = num,此时编译器会报错,更容易使你找出这个错误,而当你写成num = 5时,此时编译时,编译器不会报错,找出错误更加困难。

2.2 switch语句

switch语句也是一种分支语句,更广泛应用于多分枝的情况。其功能和if类似,但当分支多的时候,使用switch语句则显得更加简单

比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
那我们写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。

switch(整型表达式) {
case 整形常量表达式:
语句; }

合理使用switch语句可以大幅减少我们的代码量

2.2.1 在switch中的break

上述需求的代码实现如下:

#include <stdio.h>
int main()
{
    int day = 0;
    switch(day)
   {
        case 1printf("星期一\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; }

break语句的实际效果是将语句列表划分为不同的分支部分。

break语句的作用我们看起来十分晦涩,我们用代码来进行理解以下。例如:有时候我们的需求变了

  1. 输入1-5,输出的是“weekday”;
  2. 输入6-7,输出“weekend”

这时我们将代码写为

#include <stdio.h>
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0; }

这里我们可以看到,由于没有加break语句,当day为1的时候,此时进入case1,没有遇到break继续往下执行,直到遇到break。到这里break
的作用就已经在我们心中清楚起来了。

这里延申一点:一般在最后一个case语句的后面加上break。之所以这样是可以避免将来我们在添加case 的时候忘记将前面一个case的最后加上break

2.2.2 default子句

当我们在写switch语句的时候,如果表达式的值与case的值不匹配怎么办呢? 其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签 default: 写在任何一个 case 标签可以出现的位置。 当 switch
表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

这里就不用代码举例了,无非是在最后一个case后面(一般是在最后,但也可以在前面)加上一个

defalt:

总结

这篇博客介绍了分支语句(if语句和switch语句)
其实,在日常编码中,if语句使用得更加频繁,因为swich语句限制是比较大的(case后面只能跟整形常量表达式)这就导致很多情况下无法使用switch语句。

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dontflinch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值