选择程序结构:if-else

加入嵌入式技术QQ群:398294860,免费获取嵌入式技术文档,嵌入式最新学习路线指南,更多嵌入式教程,访问宅学部落淘宝店:https://wanglitao.taobao.com/

一个表达式的后面加一个分号“;”,这个表达式就变成了一个语句。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结构来应对这种分支过多的情况。

专门为嵌入式设计的C语言进阶视频教程:《C语言嵌入式Linux高级编程》,一共9期,涉及计算机体系结构、ARM汇编与反汇编、程序的编译链接原理、堆栈内存、Linux内核的面向对象编程思想、多任务编程、C语言的模块化编程等专题,具体课程详情可点击淘宝:C语言嵌入式Linux高级编程