2.3条件分支语句

98 阅读3分钟

条件分支语句 ——程序世界的红绿灯控制系统


一、if-else嵌套:逻辑迷宫导航

1. 基本结构解析

// 基础格式(注意花括号对齐)  
if (条件A) {  
    // 条件A为真时执行  
} else if (条件B) {  
    // 条件B为真时执行  
} else {  
    // 以上条件均不满足时执行  
}  

2. 边界条件实战(游戏伤害计算案例)

int hp = 120;  
int damage = 55;  
​
// 多层嵌套判断  
if (damage >= 100) {  
    printf("暴击!");  
    hp -= damage * 2;  
} else if (damage > 50) {  
    printf("重击!");  
    hp -= damage;  
} else if (damage > 0) {  // 明确下限  
    printf("普通攻击");  
    hp -= damage;  
} else {  
    printf("攻击无效");  // 处理异常输入  
}  
​
// 最终HP不低于0  
hp = (hp < 0) ? 0 : hp;  

常见陷阱

  • 悬空else问题:else匹配最近的if

    if (x > 0)  
        if (y > 0)  
            printf("第一象限");  
    else  
        printf("其他区域");  // 实际属于内层ifelse!  
    
  • 浮点数比较误差

    float angle = 90.0f;  
    if (angle == 90.0f) {}  // 危险!应改为fabs(angle-90.0)<1e-6  
    

二、switch-case:离散值处理专家

1. 标准结构与break陷阱

// 按键检测案例(游戏开发场景)  
char input = getchar();  
​
switch (input) {  
    case 'W':  
        move_forward();  
        break;  // 必须break阻止穿透  
    case 'S':  
        move_backward();  
        break;  
    case 'A':  
    case 'D':   // 合并处理A和D  
        rotate_camera();  
        break;  
    default:    // 处理未知输入  
        printf("无效按键\n");  
        break;  
}  

2. 穿透特性对比表

代码示例输出结果
case 'A': 无break执行A和后续所有case
case 'A': break;仅执行A
default: 放最前面必须所有case都不匹配

限制条件

  • 仅支持整型:int、char、enum等(不可用浮点/字符串)
  • case必须为常量:不能用变量或表达式

三、三元运算符:简洁的力量

1. 基础语法与嵌套使用

// 简单赋值  
int max = (a > b) ? a : b;  
​
// 嵌套判断(可读性下降,谨慎使用)  
char *msg = (score >= 90) ? "优秀" :  
            (score >= 60) ? "及格" : "不及格";  
​
// 函数返回简化  
int abs(int x) {  
    return (x >= 0) ? x : -x;  
}  

2. 与if-else的性能差异

  • 现代编译器对简单分支的优化能力相同
  • 三元运算符更适合返回值的场景

四、避坑指南:6个血泪教训

  1. if条件中的赋值操作

    if (x = 5) {}   // 错误!实际是赋值,永远为真  
    
  2. switch使用浮点数

    switch (3.14) {} // 编译错误!  
    
  3. 遗漏default处理

    switch (color) {  
        case RED: break;  
        case BLUE: break;  
        // 没有default,无法处理意外输入  
    }  
    
  4. 三元运算符副作用

    int a = 5, b = 10;  
    (a > b) ? a++ : b++; // 可能产生意外副作用  
    
  5. 复杂条件不拆分

    if (x > 0 && y < 10 || z == 5) {} // 难维护,应拆分  
    
  6. 忽略枚举完整性

    enum State {IDLE, RUNNING};  
    switch (state) {  
        case IDLE: break;  
        // 缺少RUNNING处理,导致未定义行为  
    }  
    

五、总结:分支选择决策模板

使用if-else当

  • 需要处理范围判断(如score >= 60)
  • 条件包含复杂逻辑运算(如多个&&/||组合)
  • 需要处理浮点数比较

使用switch-case当

  • 处理离散值匹配(如菜单选项、状态机)
  • case数量超过3个(提升可读性)
  • 需要合并处理多个值(如case 'A': case 'B':)

使用三元运算符当

  • 简单二选一赋值
  • 需要表达式返回值
  • 代码简洁性优先且逻辑简单

🚫 禁止操作

  • 在switch中忘记写break
  • 用三元运算符替代所有if-else
  • 嵌套超过3层的条件判断(应拆分子函数)

终极心法:想象你写的每个条件分支都是十字路口的红绿灯——清晰的逻辑能让代码车流畅通无阻,混乱的分支则会引发程序世界的"交通瘫痪"! 🚦