首页 > 编程笔记

C语言if else语句的用法(图解)

选择结构通过对给定的条件进行判断,来确定执行程序流程中的哪个语句。

C语言中的选择结构也称为分支结构,选择结构可以用分支语句来实现。分支语句包括 if 语句和 switch 语句:
文本我们讲解 if else 语句的用法,关于 switch 的用法,请转到《C语言switch case语句》。

C语言 if 语句

C语言 if 语句的一般语法如下。

if(表达式)
语句;

其执行过程为,先计算表达式的值,如果表达式为非 0(即为真),则执行选择结构内的语句;否则不执行任何语句,结束并退出 if 语句,继续执行 if 语句之后的程序部分。该格式中的“语句”有可能不被执行(当表达式为假时)。

其中,表达式必须是关系表达式或逻辑表达式,语句可以为简单语句或复合语句,本文后面的内容只要提到“语句”的部分都是指简单语句或复合语句。

if 语句的流程图表示如下:
C语言if语句流程图

例如:

if(x>y) printf("%d",x);

这个语句的含义为:如果 x 大于 y,输出 x 的值,否则什么也不做。

注意,初学者容易在语句(if)后面误加分号,例如:

if(x>y); x+=y;

这样相当于满足条件执行空语句,下面的 x+=y 语句将被无条件执行。一般情况下,if 条件后面不需要加分号。

示例1

输入3个不同的数,按从大到小的顺序输出。

第1步:问题分析。

假设3个数分别为 a、b、c。
用流程图描述如下:

第2步:编程实现。
#include<stdio.h>
int main()
{
    int a,b,c,t; /*t为临时变量*/
    printf("请输入 a,b,c:");
    scanf("%d%d%d",&a,&b,&c);
    if(a<b)  /*如果a<b,交换a,b的值,通过下面3条语句实现,使a中始终存放较大者*/
    {
        t=a; a=b;b=t;
    }
    if(a<c) {t=a;a=c;c=t;} /*若a<c,交换a,c的值,那么a是三者的最大值*/
    if(b<c) {t=b,b=c,c=t;} /*再比较b与c的大小,使b为第二大者*/
    printf("从大到小输出:\n");
    printf("%d\t %d \t%d\n",a,b,c); /*输出排序后的结果*/
}
编译、连接、运行程序,根据提示分别输入 a、b、c的值 20、-9、3,按【Enter】键,即可输出 a、b、c 这3个数从大到小排序的结果,如下所示:

请输入 a,b,c:20 -9 3
从大到小输出:
20       3      -9


实现两个变量的交换,通常都要引入第 3 个变量,进行 3 次赋值操作。假设 a 的值为 2,b 的值为 3,交换 a、b 两个变量,需要引入第 3 个变量 t,执行 t=a;a=b;b=t; 才可以。其过程为将 a 的值 2 赋给 t,此时变量 a 与 t 的值都为 2;再将 b 的值赋给 a,a 中的值已经变成了 3;最后将 t 中的值赋给 b,t 中存放的是原来 a 的值即 2,赋给 b 后,b 的值就是 2。

但是如果写成“a=b;b=a;”就错了。因为 b 的值赋给 a 后,a 的值变成了 3,原来的 2 已经不存在了,再执行 b=a,结果两个变量是同值,都是 3。可见这两条语句并不能实现变量的交换。

提示:在 if 语句中,可以包含多个操作语句(如上面的例子),此时必须用“{}”将几条语句括起来作为一个复合语句。

C语言 if else 语句

if 语句的标准形式为 if else,当给定的条件满足时,执行一个语句;当条件不满足时,执行另一个语句。其一般语法格式如下。

if(表达式)
    语句 1;
else
    语句 2;

其执行过程为:先计算表达式的值,如果表达式的值为非 0(即为真),则执行语句 1,否则执行语句 2。总之,该格式中的“语句1”和“语句2”总会有一个得到执行。

下图展示了 if-else 语句的流程。
C语言if else语句执行流程
例如:

if(a>0)
    printf("a is positive.\n");
else
    printf("a is not positive.\n");

其含义为,如果 a 大于 0,输出“a is positive.”,否则输出“a is not positive.”。

else 部分不能独立存在,即 else 的前面一定有 if,它一定是 if 语句的一部分。

示例2

判断输入的整数是否是 13 的倍数。
#include<stdio.h>
int main()
{
    int num;
    printf("请输入一个整数:");
    scanf("%d",&num); /* 由用户输入 */
    if(num%13==0) /* 如果输入的数是 的倍数,则执行下面的语句 */
        printf("%d 是 的倍数 !\n",num);
    else /* 若输入的数不是 的倍数,则执行下面的语句 */
        printf("%d 不是 的倍数 !\n",num);
}
编译、连接、运行程序,根据提示输入任意一个整数,按【Enter】键,即返回该整数是否为 13 的倍数。如下所示:

请输入一个整数:34
34 不是 的倍数 !


本范例中判定一个整数是否为 13 的倍数的方法是该数被 13 除,如果能除尽(即余数为零),就是 13 的倍数,否则,就不是 13 的倍数。

if 后面“()”内的表达式应该为关系或逻辑表达式,该例中是一个关系表达式,判断两数是否相等。如果在条件括号内只是单一的一个量,则C语言规定:以数值 0 表示“假”,以非 0 值表示“真”。因为在C语言中,没有表示“真”“假”的逻辑量。

C语言 if else 的嵌套形式

前两种形式的 if 语句一般都用于两个分支的情况。现实中的各种条件是很复杂的,在满足一定的条件下,又需要满足其他的条件才能确定相应的动作。因此,C语言提供了 if 语句的嵌套功能,即一个 if 语句能够在另一个 if 语句或 if-else 语句里,这种形式称作 if 语句的嵌套。if 语句嵌套的目的是解决多分支选择问题。

嵌套有如下两种形式。

1) 嵌套在 else 分支中,形成 if-else-if 语句

其形式如下:

if (表达式1)  语句1;
else if (表达式2)  语句2;
else if (表达式3)  语句3;
...
else  语句n;

该结构的流程图如下:
C语言if else if语句执行流程

示例3

评价学生的成绩。按分数 score 输出等级:score≥90 为优,80≤score<90 为良,70≤score<80 为中等,60≤score<70 为及格,score<60 为不及格。
#include<stdio.h>
int main()
{
    int score;
    printf("请输入成绩:");
    scanf("%d",&score); /*由用户输入成绩*/
    if(score>=90) /*判断成绩是否大于等于90*/
        printf("\n优\n");
    else if(score>=80) /*判断成绩是否大于等于80小于90*/
        printf("\n良\n");
    else if(score>=70) /*判断成绩是否大于等于70小于80*/
        printf("\n中\n");
    else if(score>=60) /*判断成绩是否大于等于60小于70*/
        printf("\n及格\n");
    else /*成绩小于60*/
        printf("\n不及格\n");
}
运行结果:

请输入成绩:67

及格


本范例中有 5 个分数段,所以 5 个输出语句只能有一个得到执行。是从高向低判断的,从 100 分开始判断,先考虑大于等于 90 分的情况,然后是小于 90 分的情况,再考虑大于等于 80 分的情况等,一直将所有的情况分析完毕。

如果我们从最低点 0 处开始判断,即先考虑小于 60 分的情况,再考虑大于等于 60 分的情况,程序分支部分可以改写为:
if(score<60)
    printf("\n 不及格 \n");
else if(score<70)
    printf("\n 及格 \n");
else if(score<80)
    printf("\n 中等 \n");
else if(score<90)
    printf("\n 良 \n");
else
    printf("\n 优 \n");
注意:一般使用嵌套结构的if语句时,需注意合理地安排给定的条件,即符合给定问题在逻辑功能上的要求,又要增加可读性。

2) 嵌套在 if 分支中

其形式为:

if( 表达式 1)
    if( 表达式 2)
        语句1;
    else 
        语句2;
else
    语句3;

该结构的流程图如下。
C语言在if分支中嵌套if else语句

示例4

判断某学生的成绩 score 是否及格,如果及格是否达到优秀(score≥90)。
#include<stdio.h>
int main()
{
    int score;
    printf("请输入该学生成绩:");
    scanf("%d",&score); /*由用户输入成绩*/
    if(score>=60) /*判断成绩是否大于等于60*/
        if(score>=90) /*若大于60,是不是还大于等于90*/
            printf("\n优秀\n");
        else  /*大于60,但小于90*/
            printf("\n及格\n");
    else  /*小于60*/
        printf("\n不及格\n");
}
运行结果:

请输入该学生成绩:98

优秀


本范例中采用的是第 2 种嵌套形式,如果在 if 分支中嵌套的是只有 if 没有 else 的分支结构,就成了下面的情况。

if( 表达式 1)
    if( 表达式 2)
        语句1;
    else
        语句2;

改写本例,即把“else printf("\n及格\n");”去掉,整个程序就变成了:

if(score>60)
    if(score>=90)
        printf("\n 优秀 \n");
    else
        printf("\n 不及格 \n");

此时,从书写形式上看,“else printf("\n不及格\n");”似乎与 if(score>60) 是匹配的,但是按照C语言规定的 if 和 else“就近配对”原则,即 else 总是与前面最近的(未曾配对的)if 配对。那么上面的代码实际等价于:

if(score>60)
{
    if(score>=90)
        printf("\n 优秀 \n");
    else
        printf("\n 不及格 \n");
}

也就是 else 与第 2 个 if 构成了 if-else 语句,但从逻辑上来看,与题目是矛盾的。为了保证 else 与第 1 个 if 配对,必须用花括号将第 2 个 if 语句括起来作为第 1 个 if 语句的分支部分。

if(score>60)
{
    if(score>=90)
        printf("\n 优秀 \n");
}
else
    printf("\n 不及格 \n");

提示:if 语句的嵌套结构可以是 if-else 形式和 if 形式的任意组合,被嵌套的 if 语句仍然可以是 if 语句的嵌套结构,但在实际应用中是根据实际问题来决定的,如果需要改变配对关系,可以加“{}”。

为了便于书写和阅读,可采用左对齐形式,而分支结构的内部语句部分右缩进两格,即相匹配的“if”和“else”左对齐,上下都在同一列上,这样显得层次清晰。

优秀文章