在C程序中,我们经常会根据一个表达式的结果来执行不同的操作。这个时候我们就需要用到分支语句。
本篇博客将介绍几种分支语句。
一、if 语句
if语句的通用形式
if (expression)
statement
if语句的用法,首先对expression求值,如果这个值为真,那么就执行statement,如果为假,那么就跳过statement,继续执行下一条语句。
通常,expression是一个关系表达式,即比较两个量的大小。
用一个例子来说明这个if语句的用法
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if(a > b)
{
printf("a > b\n");
}
printf("第一次比较结束\n");
if(a < b)
{
printf("a < b\n");
}
printf("第二次比较结束\n");
return 0;
}
这个例子首先给a,b分别初始化,然后执行第一个if语句,a > b 为假,所以不会打印 a > b,会跳过这一句,接下去,输出“第一次比较结束”。程序继续执行,便遇到了第二条 if 语句,判断 a < b 成立,所以会执行里面的printf语句,打印 a < b,然后程序继续执行,打印“第二次比较结束”,程序继续执行至结束。
下面是程序的结果
二、if else 语句
if else 语句的通用形式
if (expression)
statement1
else
statement2
if else 语句的用法,首先对expression求值,如果值为真,那么就执行statement1,如果值为假,那么就执行statement2。
使用if else 语句的时候最好养成良好的习惯,要注意缩进。
用一个简单的例子来看一下if else语句的用法
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if(a > b)
{
printf("a > b\n");
}
else
{
printf("a < b\n");
}
return 0;
}
上面的代码首先分别给a和b初始化,然后判断a > b 是否成立,如果成立就输出 a > b, 否则就输出a < b。
最后输出的结果是这样的。
if语句的嵌套
有时候我们会需要将几个if语句进行嵌套使用,这个时候就需要注意if 和 else的匹配。
【注】:else 总是和离它最近的一个并且没有匹配的 if 进行匹配。
首先来看一个糟糕的例子
int a = 1;
int b = 2;
int c = 3;
if(a > b)
if(b > c)
printf("测试语句1\n");
else
{
printf("测试语句2\n")
}
else
{
printf("测试语句3\n");
}
上面的这两个else和if该怎么匹配呢,首先要寻找离第一个else最近且没有匹配的 if 进行匹配,我们可以看到第二个 if 就符合这两个条件,所以第一个else应该与第二个if匹配。很自然的第一个if 和 最后一个else 匹配。
当然上面这是一个糟糕的例子,很多人看了都会头大,这个时候我们就需要有良好的编程规范,所以我们要适当的缩进并且加上大括号,来看一下改进后的例子
int a = 1;
int b = 2;
int c = 3;
if(a > b)
{
if(b > c)
printf("测试语句1\n");
else
{
printf("测试语句2\n")
}
}
else
{
printf("测试语句3\n");
}
改进之后就能很容易的看出else 和 if的匹配关系了,但是只靠缩进也不能完全看出它们匹配关系,所以还是要记住上面的这个规则。
三、switch语句
当我们的程序有很多的选项时,用if else 语句也是可以进行的,但是C语言提供了一个更为方便的语句,switch语句。
switch语句的构造
switch (整型表达式)
{
case 常量1:
语句
case 常量2:
语句
default :
语句
}
【注】
这里的整型表达式的值应该是一个整数值(包括char类型),case 后面的必须是常量,不能用变量作为case的标签
用法
首先会计算整型表达式的值,然后根据求出来的值来寻找case标签,如果找到对应的标签就会从这个标签后面的语句开始依次执行,如果希望只执行一个标签后面的内容,需要在执行完的语句后加上break。如果没有找到相应的case标签就会执行default 后面的语句。
用一个简单例子来说明一下这个语句的用法
首先是没有加break语句的情况
#include <stdio.h>
int main()
{
int num = 2;
switch(num)
{
case 1:
printf("测试语句1\n");
case 2:
printf("测试语句2\n");
case 3:
printf("测试语句3\n");
default :
printf("没有与之匹配的标签\n");
}
return 0;
}
这里num的值是2, 所以会找到与之相匹配的标签,打印“测试语句2”,因为没有break,所以会一直执行下去直到程序结束。
看看运行的结果是怎么样的
和我们预计的一样,但是我们的本意应该是只执行相应标签后面的内容,其他的标签后面的内容不执行,我们在每个printf语句后加上break
switch(num)
{
case 1:
printf("测试语句1\n");
break;
case 2:
printf("测试语句2\n");
break;
case 3:
printf("测试语句3\n");
break;
default :
printf("没有与之匹配的标签\n");
break;
}
再来看看结果
这次只是输出了“测试语句2”,符合了我们的本意。
在很多情况下,switch中都会加上break,因为我们用到这个语句的时候,就是根据多种不同的情况来执行不同才操作,所以往往都需要加上break。