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++程序的重要基础。