选择程序结构:if-else
一个表达式的后面加一个分号“;”,这个表达式就变成了一个语句。C语言程序是由一条一条的语句组成的,每条语句使用语句结束符“;”来标记。不同的语句通过不同组合可以实现不同的功能,然后通过一对大括号{}包起来,就构成了一个代码块或函数。
计算机在执行程序时,会按顺序一条语句一条语句的执行,这种最简单的程序结构叫做顺序程序结构。但有时候为了实现复杂的程序逻辑,我们光有顺序程序结构是不够的,还需要有选择程序结构和循环程序结构。选择程序结构可以让程序的执行根据执行条件不同,跳向多个分支执行;循环程序结构可以让一段程序反复执行多次。
这三种基本的程序结构相互组合、搭配,才能构建出更多功能、更复杂逻辑的程序代码。
这一节,我们先讲讲选择程序结构。C语言提供了if、else、switch、case等关键字来实现选择程序结构。一个简单的if-else程序示例如下:
//if_demo.c
#include <stdio.h>
int main(void)
{
int a, b;
printf("input a b:");
scanf("%d %d", &a, &b);
if(a > b)
{
printf("a > b\n");
printf("if branch end...\n");
}
else
{
printf("a < b\n");
printf("else branch end...\n");
}
return 0;
}
在if-else程序结构中,程序有2个执行分支,在实际运行中到底执行哪一个路径,要根据条件表达式 a > b的值来判定:条件表达式是一个逻辑表达式,它的值只有两个:0和1,或者说是真和假。如果这个值为真,则执行if分支的代码,if分支的所有语句使用一对大括号包起来,组成一个代码块。if分支的代码执行完毕后不会再执行else分支的代码,会直接跳转到return 0;语句,结束main函数的运行。相反,如果表达式 a > b的值为假(0),程序不会执行if分支的代码,而是直接跳转到else分支执行,执行结束后接着执行return 0;语句,结束main函数的运行。
编译运行上面的程序,运行2次,每次输入不同的数据,大家可以看到不同的运算结果:
root@ubuntu:/home/code# gcc if_demo.c
root@ubuntu:/home/code# ./a.out
input a b:3 4
a < b
else branch end...
root@ubuntu:/home/code# ./a.out
input a b:5 1
a > b
if branch end...
通过2次程序的运行结果我们可以看到,根据用户输入数据的不同,程序执行了不同的分支路径。
当然,根据实际编程需要,你也可以在代码中只包含if分支
#include <stdio.h>
int main(void)
{
int a, b;
int c;
printf("input a b:");
scanf("%d %d", &a, &b);
if(b == 0)
{
printf("除数b不能为零!\n");
}
c = a/b;
printf("商是:%d\n", c);
return 0;
}
if-else if-else结构
两个数比较大小,结果一般有三种:大于、小于或等于。上面的程序我们只考虑了2种情况,当我们输入两个相同的数据时,程序的比较结果就出错了。为了完善程序,我们可以使用if-elseif-else结构,给程序再添加一个执行路径:
#include <stdio.h>
int main(void)
{
int a, b;
printf("input a b:");
scanf("%d %d", &a, &b);
if(a > b)
{
printf("a > b\n");
printf("if branch end...\n");
}
else if(a == b)
{
printf("a = b\n");
printf("else if branch end...\n");
}
else
{
printf("a < b\n");
printf("else branch end...\n");
}
return 0;
}
编译程序并运行:
root@ubuntu:/home/code# ./a.out
input a b:4 4
a = b
else if branch end...
因为程序又添加了一个相等判断的逻辑,当我们再次输入两个相等的数时,程序就可以正常打印出正确的结果了。
在各个分支的代码中,如果一个分支的代码只有一条语句,我们还可以省略掉大括号,让程序看起来更加简洁:
#include <stdio.h>
int main(void)
{
int a, b;
printf("input a b:");
scanf("%d %d", &a, &b);
if(a > b)
printf("a > b\n");
else if(a == b)
printf("a = b\n");
else
printf("a < b\n");
return 0;
}
if 语句的嵌套
在一个if语句分支的代码里,我们还可以嵌套if-else语句,或者单独的一个if分支语句
#include <stdio.h>
int main(void)
{
int a, b;
printf("input a b:");
scanf("%d %d", &a, &b);
if(a > b)
{
printf("a > b\n");
printf("if branch end...\n");
}
else
{
if(a == b)
{
printf("a = b\n");
printf("a = b branch end..\n");
}
else
{
printf("a < b\n");
printf("else branch end...\n");
}
}
return 0;
}
在上面程序的else分支的代码中,虽然由多条语句构成,但是因为使用了分支选择,并且用大括号包起来,构成了一个基本的执行单位:代码块,其实就相当于一个简单语句,因此else分支的大括号可以省略,将if(a ==b)这个语句移到else同一行,就变成了我们上面熟悉的if-else if-else结构。
在if语句中嵌套if-else语句,会使程序的嵌套层次加深,增加了程序的理解难度。而扁平化的if-else if-else结构则会让程序变得更加易读,理解起来更加容易。如果程序的分支很多,我们可以继续添加else if分支:
if(表达式1)
执行分支1;
else if(表达式2)
执行分支2;
else if(表达式3)
执行分支3;
...
else if(表达式n)
执行分支n;
else
执行分支n+1;
如果执行分支过多,此时我们应该考虑另外一种写法,C语言提供了switch-case结构来应对这种分支过多的情况。