Skip to content

C++ 判断语句

概述

判断语句(也称为条件语句或分支语句)允许程序根据不同条件执行不同的代码路径。C++提供了多种判断语句,包括if语句、switch语句等。掌握判断语句是编写逻辑清晰程序的基础。

🔀 if语句

基本if语句

cpp
#include <iostream>

int main() {
    int score = 85;
    
    std::cout << "=== 基本if语句 ===" << std::endl;
    
    // 单个if语句
    if (score >= 60) {
        std::cout << "恭喜!你及格了!" << std::endl;
    }
    
    // 可以省略大括号(但不推荐)
    if (score >= 90)
        std::cout << "优秀成绩!" << std::endl;
    
    // 推荐总是使用大括号
    if (score >= 80) {
        std::cout << "良好成绩!" << std::endl;
    }
    
    return 0;
}

if-else语句

cpp
#include <iostream>

int main() {
    int temperature = 25;
    
    std::cout << "=== if-else语句 ===" << std::endl;
    
    if (temperature > 30) {
        std::cout << "天气很热,建议开空调。" << std::endl;
    } else {
        std::cout << "天气还算凉爽。" << std::endl;
    }
    
    // 年龄判断
    int age = 20;
    if (age >= 18) {
        std::cout << "你是成年人。" << std::endl;
    } else {
        std::cout << "你是未成年人。" << std::endl;
    }
    
    // 奇偶数判断
    int number = 7;
    if (number % 2 == 0) {
        std::cout << number << " 是偶数。" << std::endl;
    } else {
        std::cout << number << " 是奇数。" << std::endl;
    }
    
    return 0;
}

if-else if-else语句

cpp
#include <iostream>

int main() {
    int score = 78;
    
    std::cout << "=== if-else if-else语句 ===" << std::endl;
    
    // 成绩等级判定
    if (score >= 90) {
        std::cout << "等级:A(优秀)" << std::endl;
    } else if (score >= 80) {
        std::cout << "等级:B(良好)" << std::endl;
    } else if (score >= 70) {
        std::cout << "等级:C(中等)" << std::endl;
    } else if (score >= 60) {
        std::cout << "等级:D(及格)" << std::endl;
    } else {
        std::cout << "等级:F(不及格)" << std::endl;
    }
    
    // 季节判断
    int month = 8;
    std::cout << "\n季节判断:" << std::endl;
    if (month >= 3 && month <= 5) {
        std::cout << "春季" << std::endl;
    } else if (month >= 6 && month <= 8) {
        std::cout << "夏季" << std::endl;
    } else if (month >= 9 && month <= 11) {
        std::cout << "秋季" << std::endl;
    } else if (month == 12 || month == 1 || month == 2) {
        std::cout << "冬季" << std::endl;
    } else {
        std::cout << "无效月份" << std::endl;
    }
    
    return 0;
}

嵌套if语句

cpp
#include <iostream>

int main() {
    int age = 25;
    bool hasLicense = true;
    bool hasExperience = false;
    
    std::cout << "=== 嵌套if语句 ===" << std::endl;
    
    // 驾驶资格检查
    if (age >= 18) {
        std::cout << "年龄符合要求。" << std::endl;
        
        if (hasLicense) {
            std::cout << "有驾驶证。" << std::endl;
            
            if (hasExperience) {
                std::cout << "可以独立驾驶。" << std::endl;
            } else {
                std::cout << "建议有经验的司机陪同。" << std::endl;
            }
        } else {
            std::cout << "需要先获得驾驶证。" << std::endl;
        }
    } else {
        std::cout << "年龄不符合驾驶要求。" << std::endl;
    }
    
    // 用户权限检查
    bool isLoggedIn = true;
    bool isAdmin = false;
    bool isOwner = true;
    
    std::cout << "\n权限检查:" << std::endl;
    if (isLoggedIn) {
        if (isAdmin) {
            std::cout << "管理员权限:可以执行所有操作。" << std::endl;
        } else if (isOwner) {
            std::cout << "所有者权限:可以编辑自己的内容。" << std::endl;
        } else {
            std::cout << "普通用户权限:只能查看内容。" << std::endl;
        }
    } else {
        std::cout << "请先登录。" << std::endl;
    }
    
    return 0;
}

🔄 switch语句

基本switch语句

cpp
#include <iostream>

int main() {
    int day = 3;
    
    std::cout << "=== 基本switch语句 ===" << std::endl;
    
    switch (day) {
        case 1:
            std::cout << "星期一" << std::endl;
            break;
        case 2:
            std::cout << "星期二" << std::endl;
            break;
        case 3:
            std::cout << "星期三" << std::endl;
            break;
        case 4:
            std::cout << "星期四" << std::endl;
            break;
        case 5:
            std::cout << "星期五" << std::endl;
            break;
        case 6:
            std::cout << "星期六" << std::endl;
            break;
        case 7:
            std::cout << "星期日" << std::endl;
            break;
        default:
            std::cout << "无效的日期" << std::endl;
            break;
    }
    
    return 0;
}

switch语句的fall-through特性

cpp
#include <iostream>

int main() {
    char grade = 'B';
    
    std::cout << "=== switch语句的fall-through ===" << std::endl;
    
    // 故意省略break的情况
    switch (grade) {
        case 'A':
        case 'a':
            std::cout << "优秀成绩!" << std::endl;
            break;
        case 'B':
        case 'b':
            std::cout << "良好成绩!" << std::endl;
            break;
        case 'C':
        case 'c':
            std::cout << "中等成绩。" << std::endl;
            break;
        case 'D':
        case 'd':
            std::cout << "及格成绩。" << std::endl;
            break;
        case 'F':
        case 'f':
            std::cout << "不及格。" << std::endl;
            break;
        default:
            std::cout << "无效等级。" << std::endl;
            break;
    }
    
    // 有意的fall-through
    int month = 4;
    std::cout << "\n月份天数:" << std::endl;
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            std::cout << "31天" << std::endl;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            std::cout << "30天" << std::endl;
            break;
        case 2:
            std::cout << "28天或29天" << std::endl;
            break;
        default:
            std::cout << "无效月份" << std::endl;
            break;
    }
    
    return 0;
}

switch语句的高级用法

cpp
#include <iostream>

enum class Operation {
    ADD,
    SUBTRACT,
    MULTIPLY,
    DIVIDE
};

double calculate(double a, double b, Operation op) {
    switch (op) {
        case Operation::ADD:
            return a + b;
        case Operation::SUBTRACT:
            return a - b;
        case Operation::MULTIPLY:
            return a * b;
        case Operation::DIVIDE:
            if (b != 0) {
                return a / b;
            } else {
                std::cout << "错误:除数不能为零!" << std::endl;
                return 0;
            }
        default:
            std::cout << "未知操作" << std::endl;
            return 0;
    }
}

int main() {
    std::cout << "=== switch语句高级用法 ===" << std::endl;
    
    double x = 10.5, y = 3.2;
    
    std::cout << "x = " << x << ", y = " << y << std::endl;
    std::cout << "加法: " << calculate(x, y, Operation::ADD) << std::endl;
    std::cout << "减法: " << calculate(x, y, Operation::SUBTRACT) << std::endl;
    std::cout << "乘法: " << calculate(x, y, Operation::MULTIPLY) << std::endl;
    std::cout << "除法: " << calculate(x, y, Operation::DIVIDE) << std::endl;
    
    // 字符类型的switch
    char operation = '+';
    std::cout << "\n字符运算符处理:" << std::endl;
    switch (operation) {
        case '+':
            std::cout << "执行加法运算" << std::endl;
            break;
        case '-':
            std::cout << "执行减法运算" << std::endl;
            break;
        case '*':
            std::cout << "执行乘法运算" << std::endl;
            break;
        case '/':
            std::cout << "执行除法运算" << std::endl;
            break;
        default:
            std::cout << "未知运算符" << std::endl;
            break;
    }
    
    return 0;
}

🆕 C++17 if语句初始化器

if语句初始化器

cpp
#include <iostream>
#include <map>
#include <string>

int main() {
    std::cout << "=== C++17 if语句初始化器 ===" << std::endl;
    
    std::map<std::string, int> scores = {
        {"Alice", 95},
        {"Bob", 87},
        {"Charlie", 92}
    };
    
    // C++17 if语句初始化器
    if (auto it = scores.find("Alice"); it != scores.end()) {
        std::cout << "找到Alice的分数: " << it->second << std::endl;
        // it只在这个if语句的作用域内可用
    } else {
        std::cout << "未找到Alice" << std::endl;
        // it在else块中也可用,但值为end()
    }
    // it在这里不可访问
    
    // 传统写法对比
    auto it = scores.find("Bob");  // it的作用域过大
    if (it != scores.end()) {
        std::cout << "找到Bob的分数: " << it->second << std::endl;
    }
    // it仍然可访问,可能导致意外使用
    
    // switch语句初始化器
    if (auto value = 42; value > 30) {
        std::cout << "值大于30: " << value << std::endl;
    }
    
    return 0;
}

🎯 条件运算符(三元运算符)

条件运算符的使用

cpp
#include <iostream>
#include <string>

int main() {
    std::cout << "=== 条件运算符 ===" << std::endl;
    
    int a = 10, b = 20;
    
    // 基本用法: condition ? value_if_true : value_if_false
    int max_value = (a > b) ? a : b;
    std::cout << "max(" << a << ", " << b << ") = " << max_value << std::endl;
    
    // 字符串选择
    int score = 75;
    std::string result = (score >= 60) ? "及格" : "不及格";
    std::cout << score << "分:" << result << std::endl;
    
    // 嵌套条件运算符
    int x = 15, y = 10, z = 25;
    int max_three = (x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z);
    std::cout << "三个数的最大值: " << max_three << std::endl;
    
    // 更清晰的写法
    auto findMax = [](int a, int b, int c) {
        if (a >= b && a >= c) return a;
        if (b >= c) return b;
        return c;
    };
    std::cout << "使用lambda的最大值: " << findMax(x, y, z) << std::endl;
    
    // 条件运算符在输出中的使用
    int number = 7;
    std::cout << number << " 是 " << ((number % 2 == 0) ? "偶数" : "奇数") << std::endl;
    
    // 函数指针选择
    auto add = [](int a, int b) { return a + b; };
    auto multiply = [](int a, int b) { return a * b; };
    
    bool useAddition = true;
    auto operation = useAddition ? add : multiply;
    std::cout << "选择的运算结果: " << operation(5, 3) << std::endl;
    
    return 0;
}

🔒 逻辑表达式和短路求值

复杂条件判断

cpp
#include <iostream>
#include <string>

bool isValidEmail(const std::string& email) {
    return !email.empty() && 
           email.find('@') != std::string::npos && 
           email.find('.') != std::string::npos;
}

bool isValidAge(int age) {
    return age >= 0 && age <= 150;
}

bool isValidUser(const std::string& name, const std::string& email, int age) {
    return !name.empty() && isValidEmail(email) && isValidAge(age);
}

int main() {
    std::cout << "=== 复杂条件判断 ===" << std::endl;
    std::cout << std::boolalpha;
    
    // 用户验证
    std::string name = "Alice";
    std::string email = "alice@example.com";
    int age = 25;
    
    if (isValidUser(name, email, age)) {
        std::cout << "用户信息有效" << std::endl;
    } else {
        std::cout << "用户信息无效,请检查:" << std::endl;
        if (name.empty()) {
            std::cout << "- 姓名不能为空" << std::endl;
        }
        if (!isValidEmail(email)) {
            std::cout << "- 邮箱格式不正确" << std::endl;
        }
        if (!isValidAge(age)) {
            std::cout << "- 年龄不在有效范围内" << std::endl;
        }
    }
    
    // 短路求值演示
    std::cout << "\n=== 短路求值演示 ===" << std::endl;
    
    int value = 0;
    
    // && 短路:第一个条件为false时,后续条件不会被计算
    if (value != 0 && 100 / value > 10) {
        std::cout << "这不会被执行" << std::endl;
    } else {
        std::cout << "避免了除零错误" << std::endl;
    }
    
    // || 短路:第一个条件为true时,后续条件不会被计算
    bool isAdmin = true;
    if (isAdmin || expensiveCheck()) {  // expensiveCheck()不会被调用
        std::cout << "权限检查通过" << std::endl;
    }
    
    return 0;
}

bool expensiveCheck() {
    std::cout << "执行了昂贵的检查" << std::endl;  // 这不会被打印
    return false;
}

🎨 判断语句最佳实践

代码风格和可读性

cpp
#include <iostream>
#include <string>

// 好的实践
namespace GoodPractice {
    void processScore(int score) {
        // 使用清晰的条件和早期返回
        if (score < 0 || score > 100) {
            std::cout << "无效分数" << std::endl;
            return;
        }
        
        if (score >= 90) {
            std::cout << "优秀 (A)" << std::endl;
        } else if (score >= 80) {
            std::cout << "良好 (B)" << std::endl;
        } else if (score >= 70) {
            std::cout << "中等 (C)" << std::endl;
        } else if (score >= 60) {
            std::cout << "及格 (D)" << std::endl;
        } else {
            std::cout << "不及格 (F)" << std::endl;
        }
    }
    
    // 使用枚举提高可读性
    enum class UserType { GUEST, USER, ADMIN };
    
    void checkPermission(UserType type) {
        switch (type) {
            case UserType::ADMIN:
                std::cout << "管理员:全部权限" << std::endl;
                break;
            case UserType::USER:
                std::cout << "用户:基本权限" << std::endl;
                break;
            case UserType::GUEST:
                std::cout << "访客:只读权限" << std::endl;
                break;
        }
    }
}

// 避免的做法
namespace BadPractice {
    void processScore(int score) {
        // 避免:过度嵌套
        if (score >= 0) {
            if (score <= 100) {
                if (score >= 90) {
                    std::cout << "优秀" << std::endl;
                } else {
                    if (score >= 80) {
                        std::cout << "良好" << std::endl;
                    } else {
                        // 更多嵌套...
                    }
                }
            }
        }
    }
    
    // 避免:魔法数字
    void checkAccess(int userLevel) {
        if (userLevel == 3) {  // 3代表什么?
            // ...
        }
    }
}

int main() {
    std::cout << "=== 判断语句最佳实践 ===" << std::endl;
    
    // 好的实践示例
    GoodPractice::processScore(85);
    GoodPractice::checkPermission(GoodPractice::UserType::ADMIN);
    
    // 使用const改善可读性
    const int PASSING_SCORE = 60;
    const int EXCELLENT_SCORE = 90;
    
    int studentScore = 75;
    if (studentScore >= EXCELLENT_SCORE) {
        std::cout << "优秀学生!" << std::endl;
    } else if (studentScore >= PASSING_SCORE) {
        std::cout << "及格学生。" << std::endl;
    } else {
        std::cout << "需要补考。" << std::endl;
    }
    
    // 使用函数提高可读性
    auto isWeekend = [](int day) {
        return day == 6 || day == 7;  // 星期六或星期日
    };
    
    int today = 6;
    if (isWeekend(today)) {
        std::cout << "今天是周末!" << std::endl;
    } else {
        std::cout << "今天是工作日。" << std::endl;
    }
    
    return 0;
}

常见陷阱和解决方案

cpp
#include <iostream>

int main() {
    std::cout << "=== 常见陷阱和解决方案 ===" << std::endl;
    
    // 陷阱1:赋值 vs 比较
    int x = 5;
    // if (x = 10) {  // 错误!这是赋值,不是比较
    if (x == 10) {    // 正确:比较
        std::cout << "x等于10" << std::endl;
    }
    
    // 陷阱2:浮点数比较
    double a = 0.1 + 0.2;
    double b = 0.3;
    // if (a == b) {  // 可能为false!
    const double EPSILON = 1e-9;
    if (std::abs(a - b) < EPSILON) {
        std::cout << "浮点数相等(使用误差范围)" << std::endl;
    }
    
    // 陷阱3:忘记break语句
    int day = 2;
    switch (day) {
        case 1:
            std::cout << "星期一" << std::endl;
            // 忘记break,会继续执行下一个case
        case 2:
            std::cout << "星期二" << std::endl;
            break;  // 记得添加break
        default:
            std::cout << "其他" << std::endl;
            break;
    }
    
    // 陷阱4:空语句
    if (x > 0); {  // 注意分号!这创建了一个空的if语句
        std::cout << "这总是会执行" << std::endl;
    }
    
    // 正确写法
    if (x > 0) {
        std::cout << "x是正数" << std::endl;
    }
    
    return 0;
}

总结

C++判断语句是程序逻辑控制的核心工具:

主要判断语句类型

  • if语句:基础条件判断,支持单分支、双分支、多分支
  • switch语句:多值匹配,适合离散值的判断
  • 条件运算符:简洁的三元表达式,适合简单条件赋值

关键特性

  • 短路求值:逻辑运算符的优化特性
  • 作用域控制:C++17的if初始化器
  • 类型安全:枚举类型提高代码可读性
  • fall-through:switch语句的贯穿特性

最佳实践

  • 使用大括号增强可读性
  • 避免过度嵌套,使用早期返回
  • 使用有意义的常量替代魔法数字
  • 注意浮点数比较的特殊性
  • 合理使用枚举提高代码质量

掌握判断语句的正确使用方法是编写逻辑清晰、可维护C++程序的重要基础。

本站内容仅供学习和研究使用。