条件判断

程序的决策能力

条件判断是程序做出决策的基础,它让程序能够根据不同的情况执行不同的代码。东巴文(db-w.cn) 将带你深入理解C语言的条件判断,掌握程序决策的核心技能。

💡 东巴文观点:条件判断是程序的智慧,通过条件判断,程序可以像人一样做出选择。

条件判断概述

什么是条件判断?

条件判断是根据条件的真假来决定程序执行路径的结构。条件判断的结果是一个布尔值(真或假),在C语言中用整数表示(非0为真,0为假)。

东巴文条件判断流程图

开始
  ↓
条件判断
  ↓
┌─────┐
│ 真  │ → 执行代码块1
└─────┘
  ↓
┌─────┐
│ 假  │ → 执行代码块2
└─────┘
  ↓
结束

if语句

基本语法

东巴文语法

if (条件表达式) {
    // 条件为真时执行的代码
}

东巴文说明

  • 条件表达式的值为非0(真)时,执行代码块
  • 条件表达式的值为0(假)时,跳过代码块
  • 如果代码块只有一条语句,可以省略花括号(但不推荐)

示例代码

#include <stdio.h>

int main() {
    int age;
    
    printf("请输入年龄:");
    scanf("%d", &age);
    
    if (age >= 18) {
        printf("您已成年!\n");
    }
    
    return 0;
}

条件表达式

东巴文条件表达式表

表达式 说明 示例
关系表达式 比较两个值 a > b
逻辑表达式 组合多个条件 a > 0 && b > 0
算术表达式 非零为真 a + b
赋值表达式 赋值后的值 a = 5
#include <stdio.h>

int main() {
    int a = 5, b = 3;
    
    // 关系表达式
    if (a > b) {
        printf("a > b\n");
    }
    
    // 逻辑表达式
    if (a > 0 && b > 0) {
        printf("a和b都大于0\n");
    }
    
    // 算术表达式
    if (a + b) {
        printf("a + b = %d (非零)\n", a + b);
    }
    
    return 0;
}

if-else语句

基本语法

东巴文语法

if (条件表达式) {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}

示例代码

#include <stdio.h>

int main() {
    int num;
    
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    if (num % 2 == 0) {
        printf("%d 是偶数\n", num);
    } else {
        printf("%d 是奇数\n", num);
    }
    
    return 0;
}

常见应用场景

#include <stdio.h>

int main() {
    // 判断正负
    int num = -5;
    if (num >= 0) {
        printf("%d 是非负数\n", num);
    } else {
        printf("%d 是负数\n", num);
    }
    
    // 判断及格
    int score = 75;
    if (score >= 60) {
        printf("成绩:%d, 及格!\n", score);
    } else {
        printf("成绩:%d, 不及格!\n", score);
    }
    
    // 判断大小
    int a = 10, b = 5;
    if (a > b) {
        printf("a(%d) > b(%d)\n", a, b);
    } else {
        printf("a(%d) <= b(%d)\n", a, b);
    }
    
    return 0;
}

if-else if-else语句

基本语法

东巴文语法

if (条件表达式1) {
    // 条件1为真时执行
} else if (条件表达式2) {
    // 条件2为真时执行
} else if (条件表达式3) {
    // 条件3为真时执行
} else {
    // 所有条件都为假时执行
}

示例代码

#include <stdio.h>

int main() {
    int score;
    
    printf("请输入成绩(0-100):");
    scanf("%d", &score);
    
    if (score >= 90 && score <= 100) {
        printf("优秀!\n");
    } else if (score >= 80 && score < 90) {
        printf("良好!\n");
    } else if (score >= 70 && score < 80) {
        printf("中等!\n");
    } else if (score >= 60 && score < 70) {
        printf("及格!\n");
    } else if (score >= 0 && score < 60) {
        printf("不及格!\n");
    } else {
        printf("成绩无效!\n");
    }
    
    return 0;
}

执行流程

东巴文执行流程图

开始
  ↓
条件1? ─── 真 ──→ 执行代码块1 ──→ 结束
  ↓ 假
条件2? ─── 真 ──→ 执行代码块2 ──→ 结束
  ↓ 假
条件3? ─── 真 ──→ 执行代码块3 ──→ 结束
  ↓ 假
执行else代码块 ──→ 结束

switch语句

基本语法

东巴文语法

switch (表达式) {
    case 常量1:
        // 代码块1
        break;
    case 常量2:
        // 代码块2
        break;
    // ...
    default:
        // 默认代码块
        break;
}

东巴文说明

  • 表达式的值必须是整数或字符
  • case 后面必须是常量表达式
  • break 用于跳出 switch 语句
  • default 用于处理所有 case 都不匹配的情况

示例代码

#include <stdio.h>

int main() {
    int day;
    
    printf("请输入星期几(1-7):");
    scanf("%d", &day);
    
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("输入错误!\n");
            break;
    }
    
    return 0;
}

case穿透

#include <stdio.h>

int main() {
    char grade;
    
    printf("请输入等级(A-E):");
    scanf(" %c", &grade);
    
    switch (grade) {
        case 'A':
        case 'a':
            printf("优秀!\n");
            break;
        case 'B':
        case 'b':
            printf("良好!\n");
            break;
        case 'C':
        case 'c':
            printf("中等!\n");
            break;
        case 'D':
        case 'd':
            printf("及格!\n");
            break;
        case 'E':
        case 'e':
            printf("不及格!\n");
            break;
        default:
            printf("输入错误!\n");
            break;
    }
    
    return 0;
}

东巴文说明:利用 case 穿透特性,可以让多个 case 执行相同的代码。

switch vs if-else

东巴文对比表

特性 switch if-else 东巴文说明
条件类型 整数、字符 任意表达式 switch 限制更多
判断方式 精确匹配 范围判断 if-else 更灵活
执行效率 高(跳转表) 低(顺序判断) switch 效率更高
可读性 一般 switch 更清晰
适用场景 多个离散值 复杂条件 根据情况选择

嵌套条件判断

嵌套if语句

#include <stdio.h>

int main() {
    int age;
    char gender;
    
    printf("请输入年龄:");
    scanf("%d", &age);
    
    printf("请输入性别(M/F):");
    scanf(" %c", &gender);
    
    if (age >= 18) {
        if (gender == 'M' || gender == 'm') {
            printf("成年男性\n");
        } else if (gender == 'F' || gender == 'f') {
            printf("成年女性\n");
        } else {
            printf("性别输入错误\n");
        }
    } else {
        printf("未成年\n");
    }
    
    return 0;
}

嵌套switch语句

#include <stdio.h>

int main() {
    int year, month;
    
    printf("请输入年份:");
    scanf("%d", &year);
    
    printf("请输入月份:");
    scanf("%d", &month);
    
    switch (month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            printf("%d年%d月有31天\n", year, month);
            break;
        case 4: case 6: case 9: case 11:
            printf("%d年%d月有30天\n", year, month);
            break;
        case 2:
            // 判断闰年
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                printf("%d年%d月有29天(闰年)\n", year, month);
            } else {
                printf("%d年%d月有28天\n", year, month);
            }
            break;
        default:
            printf("月份输入错误!\n");
            break;
    }
    
    return 0;
}

条件运算符

基本语法

东巴文语法

条件 ? 表达式1 : 表达式2

东巴文说明

  • 如果条件为真,返回表达式1的值
  • 如果条件为假,返回表达式2的值

示例代码

#include <stdio.h>

int main() {
    int a = 10, b = 5;
    
    // 求最大值
    int max = (a > b) ? a : b;
    printf("最大值:%d\n", max);
    
    // 求绝对值
    int num = -5;
    int abs = (num < 0) ? -num : num;
    printf("绝对值:%d\n", abs);
    
    // 判断奇偶
    int x = 7;
    printf("%d 是%s\n", x, (x % 2 == 0) ? "偶数" : "奇数");
    
    // 成绩等级
    int score = 85;
    printf("成绩:%d, %s\n", score, 
           (score >= 90) ? "优秀" :
           (score >= 80) ? "良好" :
           (score >= 70) ? "中等" :
           (score >= 60) ? "及格" : "不及格");
    
    return 0;
}

条件运算符 vs if-else

#include <stdio.h>

int main() {
    int a = 10, b = 5;
    
    // 使用条件运算符
    int max1 = (a > b) ? a : b;
    printf("最大值:%d\n", max1);
    
    // 使用if-else
    int max2;
    if (a > b) {
        max2 = a;
    } else {
        max2 = b;
    }
    printf("最大值:%d\n", max2);
    
    return 0;
}

东巴文建议:条件运算符简洁,但不要过度使用,影响可读性。

逻辑运算符

基本逻辑运算

东巴文逻辑运算符表

运算符 名称 示例 结果 东巴文说明
&& 逻辑与 1 && 1 1 两个都为真才为真
` ` 逻辑或 `1
! 逻辑非 !1 0 真变假,假变真

组合条件

#include <stdio.h>

int main() {
    int age = 25;
    int score = 85;
    
    // 逻辑与:两个条件都满足
    if (age >= 18 && score >= 60) {
        printf("成年且及格\n");
    }
    
    // 逻辑或:至少一个条件满足
    if (age < 18 || score < 60) {
        printf("未成年或不及格\n");
    } else {
        printf("成年且及格\n");
    }
    
    // 逻辑非:取反
    int isStudent = 0;
    if (!isStudent) {
        printf("不是学生\n");
    }
    
    return 0;
}

短路求值

#include <stdio.h>

int main() {
    int a = 0, b = 5;
    
    // 短路求值:如果左边为假,右边不执行
    if (a && (b = 10)) {
        printf("条件为真\n");
    }
    printf("b = %d\n", b);  // 5,b没有被修改
    
    // 短路求值:如果左边为真,右边不执行
    if (a || (b = 20)) {
        printf("条件为真\n");
    }
    printf("b = %d\n", b);  // 20,b被修改了
    
    return 0;
}

东巴文说明:逻辑运算符有短路特性,可以提高效率,但也可能导致副作用。

东巴文最佳实践

1. 使用花括号

// ❌ 不推荐:省略花括号
if (a > b)
    printf("a > b\n");
    printf("这行不在if内\n");  // 容易误解

// ✅ 推荐:使用花括号
if (a > b) {
    printf("a > b\n");
}

2. 避免深层嵌套

// ❌ 不推荐:深层嵌套
if (a > 0) {
    if (b > 0) {
        if (c > 0) {
            printf("a, b, c都大于0\n");
        }
    }
}

// ✅ 推荐:提前返回
if (a <= 0) return;
if (b <= 0) return;
if (c <= 0) return;
printf("a, b, c都大于0\n");

3. 使用常量在左边

// ❌ 容易写错
if (a = 5) {  // 赋值,不是比较
    printf("a等于5\n");
}

// ✅ 常量在左边
if (5 == a) {  // 如果写成 5 = a 会编译错误
    printf("a等于5\n");
}

4. 合理使用switch

// ✅ 适合使用switch的情况
switch (month) {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        printf("31天\n");
        break;
    case 4: case 6: case 9: case 11:
        printf("30天\n");
        break;
    case 2:
        printf("28或29天\n");
        break;
}

// ✅ 适合使用if-else的情况
if (score >= 90) {
    printf("优秀\n");
} else if (score >= 80) {
    printf("良好\n");
} else if (score >= 70) {
    printf("中等\n");
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解条件判断的概念
  • 掌握if语句的使用
  • 掌握if-else语句的使用
  • 掌握if-else if-else语句的使用
  • 掌握switch语句的使用
  • 理解case穿透特性
  • 掌握嵌套条件判断
  • 掌握条件运算符的使用
  • 掌握逻辑运算符的使用
  • 了解短路求值特性

下一步学习

掌握条件判断后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文条件判断提示:条件判断是程序的决策中心,掌握条件判断是编写智能程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握条件判断的使用!