C语言中if的使用

1. if语句

1.1 基础概念

cpp 复制代码
if (表达式)
    语句;

当表达式成立(为真)时,则语句执⾏,当表达式不成立(为假)时,则语句不执⾏.

在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。

接下来看一个例子: 输入一个整数,判断这个数是否为奇数

cpp 复制代码
#include <stdio.h>
int main(void)
{
    int n == 0;
    scanf("%d",&n);
    if(n % 2 == 1)          //余数为1是奇数
        printf("%d是一个奇数\n",n);
    return 0;
}

这里有语句执行的概念图:

1.2 else

如果一个问题只有两种情况,非黑即白,那么一种是if,那么另一种就是else了;如果有多重情况,将可列举的列举后,剩下的也就是else(可类比后面switch语句中的default,加强记忆).

如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?

这⾥就需 if ... else ...语句,语法形式如下:

cpp 复制代码
if ( 表达式 )
    语句1;
else
    语句2;

来看示例:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。

cpp 复制代码
#include <stdio.h>
int main(void)
{
    int num = 0;
    scanf("%d", &num);
    if(num % 2 == 1)
        printf("%d 是奇数\n", num);
    else
        printf("%d 是偶数\n", num);
    return 0;
}

一个整数,不是奇数就是偶数,如果判断if判断num为奇数,就直接执行if里的语句,否则就执行else里的语句.

练习: 输⼊⼀个年龄,>=18岁就输出:成年,否则就输出:未成年

cpp 复制代码
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age >= 18)
        printf("成年\n");
    else
        printf("未成年\n");
    return 0;
}

同上.

1.3 分支中包含多条语句

默认在 if 和 else 语句中默认都只控制⼀条语句,如果没有大括号的话就最多只能控制一条语句.

⽐如:

cpp 复制代码
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age >= 18)
        printf("成年了\n");            //这里想让后面的两个语句都受if管理
        printf("可以学习编程了\n");
    return 0;
}

上⾯的代码,你会发现输⼊的age值不管是大于等于18 还是小于18,"可以学习编程了"都会被打印在屏幕上.

这显然回应不了我们的需求,这是为什么呢?

这是因为 if 语句只能控制在其后面的⼀条语句,就是 printf(" 成年了 \n"); ,if语句为真,则打印成年了, if语句为假,则不打印"成年了".

而对于 printf(" 可以学习编程了 \n"); 是独⽴于if语句存在的,不管if语句的条件是真还是假,这条语句都会被执⾏。那如果我们要if语句同时控制两条或多条语句.

该怎么办呢?那就要使⽤大括号{ }将想被if控制的所有语句括起来, 当然else 后也可以跟上⼤括号来起到相同作用。

如下:

cpp 复制代码
int main(void)
{
    int age = 0;
    scanf("%d",&age);
    if(age >= 18)         //两个语句都被同一个大括号包括
    {
        printf("成年了\n");
        printf("可以学习编程了\n");
    }
    else
    {
        printf("未成年\n");
        printf("当然也可以学习编程\n");
    }
    return 0;
}

1.4 嵌套if

在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断,也就是之后要说到的选择.

示例比如:要求输入一个整数,判断其是0,还是正数抑或是负数

代码如下:

cpp 复制代码
int main(void)
{
    int num = 0;
    scanf("%d",&num);
    if(num == 0)
    {
        printf("输入的数字是零\n");
    }
    else if(num > 0)
    {
        printf("输入的数字是正数\n");
    }
    else
    {
        printf("输入的数字是负数\n");
    }
    return 0;
}

下图中的红圈里代码就是嵌套在前⾯的 else ⼦句中的,也就是在前一个else包含的范围内再进行条件判断,构成了嵌套的if语句。

对于这里有些不理解的同学,我画了一张图来表达它的大体结构,可能会利于您理解,请看:

为了方便理解,接下来我们用一种最清晰的结构写一下上面的代码: 输⼊⼀个整数,如果不是正数则输出:非负数.如果是正数,再判断是奇数还是偶数,并输出;

cpp 复制代码
int main(void)
{
    int num = 0;
    scanf("%d",&num);
    if(num < 0)
    {
        printf("非正数\n");
    }
    else
    {
        if(n % 2 == 0)
        {    
            printf("偶数\n");
        }
        else
        {
            printf("奇数\n")
        }
    }
    return 0;
}

以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断.

练习:

cpp 复制代码
输⼊⼀个⼈的年龄:
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁及以上打印"⽼寿星"

这里给到参考代码:

cpp 复制代码
//⽅法1 
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age < 18)
        printf("⻘年\n");
    else if(age <= 44)
        printf("少年\n");
    else if(age <= 59)
        printf("中⽼年\n");
    else if(age <= 89)
        printf("⽼年\n");
    else
        printf("⽼寿星\n");
    return 0;
}
cpp 复制代码
//方法二: 更加清晰的逻辑 
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age < 18)
    {
        printf("少年\n");
    }
    else 
    {
        if(age <= 44)
        {
            printf("⻘年\n");
        }
        else 
        {
            if(age <= 59)
            {
                printf("中⽼年\n");
            }
            else 
            {
                if(age <= 89)
                    printf("⽼年\n");
                else
                    printf("⽼寿星\n");
            }
        }
    }
    return 0;
}

这里能很清晰的看出来else if嵌套语句就是在前一个else的范围内再做一个if..else条件语句.

1.5悬空else问题

如果有多个 if 和 else ,可以记住这样⼀条规则:else 总是跟最接近的 if 匹配。 我们⾸先从下⾯代码开始.

cpp 复制代码
include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

程序运⾏的结果是啥?

很多初学者,上来以判断 a 是0,不等于1,那就执⾏else 子语句,打印haha呗.

但是当你去运⾏代码,结果是:没有任何输出结果

为什么呢?

这就是悬空 else 的问题,如果有多个if 和 else ,可以记住这样一条规则:else总是跟最接近的if匹配。

上⾯的代码排版,让我们以为语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印其中的内容,但是这个else是与第二个if语句绑定的,而这里被绑定在一起的if...else语句被包含于第一个if语句中,这样当第一个if语句中的a == 1,判断为假是,就不对进来执行第一个if内部的语句,也就什么都不会打印.

如果代码改成下⾯这样就更加容易理解:

cpp 复制代码
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
        printf("hehe\n");
        else
        printf("haha\n");
    }
    return 0;
}

或者如果我们希望else确实和第⼀个if匹配,可以这样修改代码:

cpp 复制代码
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }
    return 0
}

只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。

相关推荐
来生硬件工程师3 小时前
【程序库】 MutiButton 按键库
c语言·笔记·stm32·单片机·mcu·嵌入式实时数据库
AI科技星3 小时前
《基于 1 的 N 维分形与对称统一理论》
人工智能·算法·机器学习·数学建模·数据挖掘
c++之路3 小时前
C++ STL
java·开发语言·c++
瞎折腾啥啊3 小时前
vcpkg与CMake
linux·c++·cmake·cmakelists
wljy13 小时前
牛客每日一题(2026.4.30) 整数域二分
c语言·c++·算法·蓝桥杯·二分
多看多敲多思考3 小时前
华润微CS32ME10 MCU使用教程(1)---CS32ME10之GPIO使用
c语言·stm32·单片机·嵌入式硬件·mcu
水蓝烟雨3 小时前
3335. 字符串转换后的长度 I
算法·leetcode
Dxy12393102163 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
westdata-Tm3 小时前
洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
算法·深度优先·dfs