条件语句
让程序有分支的运行
来到这,相信你已经对 C++ 基础的数据类型、常量变量、数据操作和输入输出都有了一定的了解。在本节前,我们所写的代码都以线性的顺序执行,而从这一节起,我们的程序将不再是一个线性执行的机器,而是能够根据不同的条件做出判断,甚至可以通过循环反复执行某些操作。我们将学习如何使用条件语句和循环语句,让程序具备分支和重复执行的能力,从而实现更加灵活和复杂的逻辑。
什么是条件语句
条件语句允许程序根据不同的条件执行不同的代码块。在日常生活中,我们经常会做出一些判断,比如说:
- 如果天气晴朗,我们就去公园散步
- 如果考试成绩大于等于60分,就及格了
- 如果年龄满18岁,就成年了
在编程中,条件语句的作用就类似于 如果...就...否则... (而事实上,在大多数语言中,基础的条件判断的关键字就是 if 和 else)
if 语句
最基本的条件语句是 if 语句,其语法格式如下:
if (条件表达式) {
// 当条件为真时执行的代码
}其中,条件表达式为一个布尔值(bool,值只有 true 或 false)的参数。如果条件表达式为 true,则执行大括号内的代码块;如果条件表达式为 false,则跳过大括号内的代码块。例如:
#include <iostream>
using namespace std;
int main() {
int age = 20;
if (age >= 18) {
cout << "你已经成年了!" << endl;
}
return 0;
}在这里,age >= 18 就是条件表达式。当 age 的值比 18 大时,这个表达式返回的结果就是 true。很显然,此处 20 > 18,所以会输出 你已经成年了!。假如 age 的值为 17,那么程序就会跳过 if,什么也不输出,直接结束。
else 语句
那么如果我还需要输出未成年的消息呢?你的确可以再使用一个 if (age < 18) {} 来进行判断,但是很显然,这并不是必要的。C++ 提供了 否则 符号,即 else。
#include <iostream>
using namespace std;
int main() {
int age = 20;
if (age >= 18) {
cout << "你已经成年了!" << endl;
} else {
cout << "你还未成年哦!" << endl;
}
return 0;
}在这里,else 语句紧跟在 if 语句之后,表示当 if 条件不成立时执行的代码块。如果 age 的值小于 18,那么 if 条件不成立,程序就会执行 else 语句中的代码块,输出 你还未成年哦!。
else if 语句
在某些情况下,需要判断的问题可能不止,比如说,在上例中,当 age < 0 时,程序也会输出 你还未成年哦!。那么如果我想让他输出 你还没有出生呢!,那么就可以使用 else if 语句来进行。
#include <iostream>
using namespace std;
int main() {
int age = 20;
if (age >= 18) {
cout << "你已经成年了!" << endl;
} else if (age < 0) {
cout << "你还没有出生呢!" << endl;
} else {
cout << "你还未成年哦!" << endl;
}
return 0;
}这段代码将会按顺序依次的判断各个条件,如果 age 的值大于等于 18,那么输出 你已经成年了!;如果 age 的值小于 0,那么输出 你还没有出生呢!;如果两个条件都不满足,那么输出 你还未成年哦!。
else if 可以无限添加,你可以像下面这样使用:
if (条件1) {
// 条件1成立时执行的代码块
} else if (条件2) {
// 条件2成立时执行的代码块
} else if (条件3) {
// 条件3成立时执行的代码块
} else {
// 其他情况执行的代码块
}小知识
if、else、else if 所执行的代码块只有一行时,是可以省略大括号的:
if (age >= 18)
cout << "你已经成年了!" << endl;
else if (age < 0)
cout << "你还没有出生呢!" << endl;
else
cout << "你还未成年哦!" << endl;但是笔者认为,在只有一行的情况下,也最好加上大括号来提升程序的可读性和程序样式的统一性。
嵌套的 if 语句
if 语句可以嵌套使用,即在一个 if 语句内部再使用 if 语句:
#include <iostream>
using namespace std;
int main() {
int age = 20;
bool hasLicense = true;
if (age >= 18) {
if (hasLicense) {
cout << "可以开车!" << endl;
} else {
cout << "年龄够了,但需要先考驾照。" << endl;
}
} else {
cout << "年龄不够,不能开车。" << endl;
}
return 0;
}但是,请不要使用太多层的 if 嵌套。这会导致代码变得臃肿难以维护,也就是我们常说的“屎山代码”。很多多层的 if 嵌套都可以在设计的时候避免,如果实在无法避免,也可以使用后面要学到的函数来封装逻辑,避免嵌套。
switch 语句
当要判断相等的条件非常多的时候,else if 就会显得冗长和不必要。比如,我们要在对应日子输出对应的星期数,假如使用 if 的话要这样写:
if (day == 1) {
cout << "星期一" << endl;
} else if (day == 2) {
cout << "星期二" << endl;
} else if (day == 3) {
cout << "星期三" << endl;
} else if (day == 4) {
cout << "星期四" << endl;
} else if (day == 5) {
cout << "星期五" << endl;
} else if (day == 6) {
cout << "星期六" << endl;
} else if (day == 7) {
cout << "星期日" << endl;
} else {
cout << "无效的日期" << endl;
}很显然,每个分支我们都需要写上重复的 day ==。我们可以使用 switch 来简化这段代码:
switch (day) {
case 1:
cout << "星期一" << endl;
break;
case 2:
cout << "星期二" << endl;
break;
case 3:
cout << "星期三" << endl;
break;
case 4:
cout << "星期四" << endl;
break;
case 5:
cout << "星期五" << endl;
break;
case 6:
cout << "星期六" << endl;
break;
case 7:
cout << "星期日" << endl;
break;
default:
cout << "无效的日期" << endl;
}我们可以看到,switch 语句的语法格式如下:
switch (表达式) {
case 值1:
// 代码块1
break;
case 值2:
// 代码块2
break;
case 值3:
// 代码块3
break;
// 更多的case...
default:
// 默认代码块
}switch 语句的工作原理是:
- 计算
switch后括号中表达式的值 - 将这个值与各个
case标签后的值进行比较 - 如果找到匹配的
case,就从该case开始执行代码,直到遇到break;或switch结束 - 如果没有找到匹配的
case,则执行default分支(如果存在的话)
注意
case 会一直向下执行,直到遇到 break; 或 switch 结束,而不是只运行完当前代码块,例如:
switch (day) {
case 1:
cout << "星期一" << endl;
case 2:
cout << "星期二" << endl;
case 3:
cout << "星期三" << endl;
case 4:
cout << "星期四" << endl;
case 5:
cout << "星期五" << endl;
case 6:
cout << "星期六" << endl;
case 7:
cout << "星期日" << endl;
default:
cout << "无效的日期" << endl;
}假如 day 为 2 的时候,这段程序将输出:
星期二
星期三
星期四
星期五
星期六
星期日
无效的日期因为没有 break,程序从 case 2 开始执行,然后继续执行 case 3,中间一直没有 break,所以直到 switch 结束才停止。
switch 还可以和我们之前提到的枚举 enum 结合使用,例如:
enum Color {
RED,
GREEN,
BLUE
};
Color color = RED;
switch (color) {
case RED:
cout << "红色" << endl;
break;
case GREEN:
cout << "绿色" << endl;
break;
case BLUE:
cout << "蓝色" << endl;
break;
default:
cout << "未知颜色" << endl;
}注意
switch表达式的结果必须是整数类型(如int、char、short等)或枚举类型,不能用于浮点数或字符串。- 每个
case标签后的值必须是编译时就能确定的常量,不能是变量。
三元表达式
C++ 还提供了一个可以用于赋值的简洁的条件表达式的写法,称为三元运算符,语法如下:
<条件> ? <值为真时的表达式> : <值为假时的表达式>例如:
#include <iostream>
using namespace std;
int main() {
int a = 5;
int b = 10;
int max = (a > b) ? a : b;
cout << "最大值是:" << max << endl;
return 0;
}三元运算符在简单的条件赋值时非常有用,但对于复杂的逻辑,还是建议使用 if-else 语句以保持代码的可读性。