Logo成贤计协指南

条件语句

让程序有分支的运行

来到这,相信你已经对 C++ 基础的数据类型、常量变量、数据操作和输入输出都有了一定的了解。在本节前,我们所写的代码都以线性的顺序执行,而从这一节起,我们的程序将不再是一个线性执行的机器,而是能够根据不同的条件做出判断,甚至可以通过循环反复执行某些操作。我们将学习如何使用条件语句和循环语句,让程序具备分支和重复执行的能力,从而实现更加灵活和复杂的逻辑。

什么是条件语句

条件语句允许程序根据不同的条件执行不同的代码块。在日常生活中,我们经常会做出一些判断,比如说:

  • 如果天气晴朗,我们就去公园散步
  • 如果考试成绩大于等于60分,就及格了
  • 如果年龄满18岁,就成年了

在编程中,条件语句的作用就类似于 如果...就...否则... (而事实上,在大多数语言中,基础的条件判断的关键字就是 ifelse

if 语句

最基本的条件语句是 if 语句,其语法格式如下:

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

其中,条件表达式为一个布尔值(bool,值只有 truefalse)的参数。如果条件表达式为 true,则执行大括号内的代码块;如果条件表达式为 false,则跳过大括号内的代码块。例如:

main.cpp
#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

main.cpp
#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 语句来进行。

main.cpp
#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 {
    // 其他情况执行的代码块
}

小知识

ifelseelse if 所执行的代码块只有一行时,是可以省略大括号的:

if (age >= 18)
    cout << "你已经成年了!" << endl;
else if (age < 0)
    cout << "你还没有出生呢!" << endl;
else
    cout << "你还未成年哦!" << endl;

但是笔者认为,在只有一行的情况下,也最好加上大括号来提升程序的可读性和程序样式的统一性。

嵌套的 if 语句

if 语句可以嵌套使用,即在一个 if 语句内部再使用 if 语句:

main.cpp
#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 语句的工作原理是:

  1. 计算 switch 后括号中表达式的值
  2. 将这个值与各个 case 标签后的值进行比较
  3. 如果找到匹配的 case,就从该 case 开始执行代码,直到遇到 break;switch 结束
  4. 如果没有找到匹配的 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;
}

注意

  1. switch 表达式的结果必须是整数类型(如 intcharshort 等)或枚举类型,不能用于浮点数或字符串
  2. 每个 case 标签后的值必须是编译时就能确定的常量,不能是变量。

三元表达式

C++ 还提供了一个可以用于赋值的简洁的条件表达式的写法,称为三元运算符,语法如下:

<条件> ? <值为真时的表达式> : <值为假时的表达式>

例如:

main.cpp
#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 语句以保持代码的可读性。