c语言中常见的结构分为3类,顺序结构,选择结构,和循环结构。而分支语句,分支就相当于有多条路可以选择自然就是属于我们的选择结构。而在c语言中分支语句主要包括两类一是if语句,二是switch语句这里我们从if语句开始说起。
if语句的基本构成为:
if(表达式)
{
语句
}if语句说的是如果括号内的表达式结果为真就执行下面的语句否则编译器就会跳过if包含的这段代码。那计算机怎么知道表达式是真是假呢?其实计算机的底层逻辑是电路,它只会用0和1来进行判断所以当if后表达式的值为真,整个表达式的值就会变成1:即if(1)此时计算机就会开始执行if后面的代码。如果表达式的值为假则相反会直接跳过if后面的代码。另外需要注意的是c语言中非零即真! 下面通过一个例子来直观的感受一下if语句
输入一个整数判断为奇数
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2!=0)
printf("是奇数");
return 0;
}
补充:%是求余运算,例如8%2=4余0所以8%2=0
这里我们输入7他就会给我们打印是奇数,说明我们if后面的表达式为真。这时就会有人要问了那如果我们输入一个偶数呢?例如输入一个8

从结果可以看出什么都没执行,按正常逻辑表达式的值肯定是0(假)所以不执行if后的语句,那怎么让编译器去判断呢?这时候就要请出与if配对的else了。 else说的是当 if后表达式为假时 才执行else后面的语句,比如面的例子我们想要实现输入偶数他就给我们打印偶数的逻辑只需要在if后加上else跟相应要执行的语句即可,还是上面的例子:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 != 0)
printf("是奇数");
else
printf("是偶数");
return 0;
}此时我们输入8

会发现已经得到了我们想要的结果。这就是当if后的8%2!=0条件为假时就会去执行else后打印“是偶数”的代码。
这时就有人要问了if或者else后只能跟一条语句吗?那我们就来说说分支中包含多条语句的情况:
#include<stdio.h>
int main()
{
int age=0;
scanf("%d",&age);
if(age>18)
{
printf("已满十八岁\n");
printf("成年了!");
}
else
{
printf("未满十八岁\n");
printf("未成年!");
}
return 0;
}我们来看这段代码的运行结果:


一般情况下if或else后只能跟一条语句 但是如果我们使用了大括号就会形成一个代码块执行多条语句,注意只有加上了大括号才能跟多条语句!
还有人好奇既然if或else后面能跟多条语句那么if或else后还能跟if或else吗?这就是if的嵌套结构,即if和else结合使用表示除了if和else以外的其他情况。
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输⼊的数字是0\n");
else if (num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}既然if能和else结合使用那么if能不能与多个else结合使用呢?这就引申出了悬空else问题 我们先来看一段代码
#include <stdio.h>
int main()
{
int a = 5; //定义一个初始值
int b = 2;
if(a == 2)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}补充:两个等号是等于,判断相等,一个等号是赋值。
思考一下你觉得这段代码的运行结果是什么,我这里直接公布答案,答案是什么结果都没有,如果你认为会打印出haha那么你就掉到陷阱里了,首先你看到a==2 与我们定义的a为5是不相等的条件为假所以执行else后语句打印haha这样的逻辑其实是错误的,因为在C语言中else会与离他最近的if去配对即上面代码的else会与第二个if配对所以第二个if和else就相当于是第一个if所包含的语句当第一个if条件为假则第一个if语句整个都会被跳过。只要记住else总是跟最近的if匹配就行了。
介绍完了if语句接下来我们说说另外一个分支语句:switch语句
除了if 语句外,C语言还提供了switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的if…else 结构,⽤于判断条件有多个结果的情况。 它把多重else if 改成更易用、可读性更好的形式。 基本构成为
switch(表达式)
{
case valua1:语句1;
case valual:语句2;
default:语句;
}与if语句不同的是if语句是做判断,判断结果为真才执行。而switch运行的逻辑则是switch会拿着表达式计算完的值去和case匹配,匹配成功才会执行相应case后面的语句,如果匹配不成功就会执行default后的语句。
举个例子:输⼊任意⼀个整数值,计算除3之后的余数
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%3==0)
{
printf("余数为0\n");
}
else if(num%3==1)
{
printf("余数为1\n");
}
else
{
printf("余数为2\n");
}
return 0;
}换成switch语句就是
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
从运行结果来看我们输入7按理说应该打印余数是1但运行结果却告诉我们余数是1余数是2,那是不是代码有问题呢? 其实不是,要完成这个任务就要用到break了
还是上面的例子我们加上break以后就会变得不一样了:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
此时我们可以很直观的看到,加了break以后就与我们的预期相符了,现在我们来分析一下整个代码的逻辑。1,首先switch会拿着num%3的值(0,1,2)这三种可能,然后去找对应的case匹配,例如上面我输入了7而7%3余数为1所以case就会去找到case 1去执行case 1后面的语句。而在我们加了break与不加break的对比中我们发现不加break会在执行case 1后接着执行case 2的内容,而加了braek后就不会接着执行case 2的内容。通过对比很明显的能知道break就是用于打断代码的,换句话说就是跳出switch语句,即case是switch的入口而break是switch的出口。 此外还要注意switch语句中不是每个case后都要加break的,是否加break要视实际情况而定
下面就是switch的最后一个内容
default与if语句中的else有些相似,用于当没有case与switch匹配上时就会执行default后的语句,举个例子输入1到7的数字打印对应的星期几
#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("输入错误请输入1~7的数");
}
return 0;
从运行结果能很明显的看到,当我们输入8时switch无法与下面的任何一个case去配对所以switch最终就会去找default最终打印“输入错误请输入1~7的数”这句话。这就是default的作用。
注意switch语句中case与default的顺序没有要求,因为switch执行的本质就是去匹配所以不存在顺序问题。
文章到此也就结束了,本文有点长十分感谢能够读到这里的优秀的读者,我要给你们点个赞,如果这篇文章能够帮到你,不妨给我一个免费的三连(三连的人全都好运)万分感谢!同时如果有错误或不足之处欢迎指出,你们的支持就是我最大的动力,我会继续努力写出更优秀的文章,感谢阅读!