Skip to content

C++ 判断语句

决策结构允许你的程序根据特定条件是真还是假来执行不同的代码块。这使得程序能够动态响应不同的输入或情况。

典型的决策结构会评估一个条件(一个结果为 true 或 false 的表达式)。如果条件为真,则执行特定的代码块。可选地,如果条件为假,则可能会执行另一个代码块。

C++ 提供了几种类型的决策语句:

语句描述
if 语句仅当指定的布尔条件为真时才执行代码块。
if...else 语句如果条件为真则执行一个代码块,如果条件为假则执行另一个代码块。
if...else if...else 语句按顺序测试多个条件,并执行与第一个真条件对应的代码块。如果之前的所有条件都不为真,则可选的最终 else 块会执行。
switch 语句允许将变量与常量值列表(case)进行相等性测试。对于特定场景,它提供了比冗长的 if...else if 链更有效的替代方案。
嵌套 if 语句你可以在其他 if 或 else 块内放置 if 或 if...else 语句来创建更复杂的决策逻辑。
嵌套 switch 语句你可以在一个 switch 语句的 case 中使用另一个 switch 语句,尽管这有时会使代码难以阅读。

C++17 引入了带有初始化器的 if 语句。这允许你在 if 语句本身的范围内声明和初始化一个变量,使代码更简洁并提高局部性。

// C++17: 带有初始化器的 if
if (int errorCode = getError(); errorCode != 0) {
std::cerr << "An error occurred: " << errorCode << std::endl;
// errorCode 仅在 if 和 else 块内可见
} else {
// errorCode 在此处也可见
std::cout << "Operation successful." << std::endl;
}

C++17 还为 switch 语句添加了 [[fallthrough]] 属性。如果你有意让一个 case 执行完毕后继续执行下一个 case,你应该添加此属性来明确你的意图并抑制潜在的编译器警告。

switch (value) {
case 1:
doSomething();
[[fallthrough]]; // 明确表示 fallthrough
case 2:
doSomethingElse();
break;
default:
handleDefault();
}

对于基于模板参数或 constexpr 值的编译时决策,C++17 引入了 if constexpr。它在编译时评估条件,并丢弃未被采用的分支,可能产生更高效的代码。

template<typename T>
void process(T value) {
if constexpr (std::is_integral_v<T>) {
std::cout << "Processing an integral type." << std::endl;
} else if constexpr (std::is_floating_point_v<T>) {
std::cout << "Processing a floating-point type." << std::endl;
} else {
std::cout << "Processing another type." << std::endl;
}
}

条件运算符(或称三元运算符)? : 提供了一种简洁的方式来在表达式中表达简单的 if...else 语句。其通用形式为:

condition ? expression_if_true : expression_if_false;

首先评估 condition。如果为真,则评估 expression_if_true,其结果成为整个条件表达式的值。如果 condition 为假,则评估 expression_if_false,其结果成为值。

示例:

int x = 10, y = 20;
int maxVal = (x > y) ? x : y; // maxVal 将被赋值为 y 的值 (20)
std::cout << "The maximum value is: " << maxVal << std::endl;

尽管简洁,过度使用三元运算符,特别是嵌套使用时,会降低代码可读性,相比于标准的 if...else 语句。