C 语言书
模块二 · 流程与数据 / 第 06 课

06 · if / else 分支

入门 30 分钟 跳到过关题
学习目标
  • 会写单分支和双分支
  • 会写多条件 else if
  • 养成「总是加大括号」的习惯

基本形态

#include <stdio.h>

int main(void)
{
    int score = 85;

    if (score >= 60)
    {
        printf("及格\n");
    }
    else
    {
        printf("不及格\n");
    }
    return 0;
}

多分支

#include <stdio.h>

int main(void)
{
    int score = 78;

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

为什么要加大括号

if 不写大括号时只控制下一条语句。以后一改代码就容易出错。工程上几乎总是写:

if (ok)
{
    step1();
    step2();  // 以后加进来也安全
}

从键盘读入再判断

真实程序很少把分数写死。用 scanf 读入:

#include <stdio.h>

int main(void)
{
    int score;

    printf("请输入分数: ");
    scanf("%d", &score);   /* 注意:要写 &score,表示“写到这个盒子” */

    if (score >= 60)
    {
        printf("及格\n");
    }
    else
    {
        printf("不及格\n");
    }
    return 0;
}

嵌套 if

条件里还可以再套条件。先想清楚「先判断谁」更合理:

#include <stdio.h>

int main(void)
{
    int has_ticket = 1;
    int age = 12;

    if (has_ticket)
    {
        if (age >= 18)
        {
            printf("全票\n");
        }
        else
        {
            printf("半票\n");
        }
    }
    else
    {
        printf("无票\n");
    }
    return 0;
}

易错点

三个高频错误
  • 把 == 写成 =
  • 条件忘加小括号:if score >= 60 非法
  • 浮点数别用 == 直接比:有精度误差,可比较差值是否小于很小的数

单片机场景 · if:温控输出完整赋值

温度决定风扇与加热器状态。每次给两个输出赋值,避免上一次状态残留。

边界与验证:普通变量逻辑示例,不直接驱动 GPIO。调用时传入两个有效变量的地址。原文部分分支未重置另一输出,此处已修正。真实温控还需故障保护和回差。

void control(int temp, unsigned char *fan,
             unsigned char *heater)
{
    *fan = 0;
    *heater = 0;
    if (temp > 30) {
        *fan = 1;
    } else if (temp <= 20) {
        *heater = 1;
    }
}

本课过关

必做

score=75,执行 if(score>=90) A; else if(score>=60) B; else C; 会执行?

必做作业
  1. 输入温度 t:t>30 打印「热」,t<10 打印「冷」,否则「舒适」。
  2. 写判断:既是偶数又大于 10。
  3. 改错:if score >= 60 printf("ok");
先自己写完,再点开看解答

1:

int t;
scanf("%d", &t);
if (t > 30)      printf("热\n");
else if (t < 10) printf("冷\n");
else             printf("舒适\n");

2:if (n % 2 == 0 && n > 10)

3:条件必须加括号:if (score >= 60) { ... }