C++ fallthrough

17 Mar 2025 | 4 分钟阅读

在 C++ 语言中,贯穿 (fallthrough) 是指 switch 语句 中的一种行为,即控制流从一个 case 流向另一个 case。当一个 case 结束时没有 break 语句,控制流就会继续执行下一个 case,从而发生贯穿。

在编程控制中,流程结构在代码的执行路径中起着至关重要的作用。在这些结构中,switch 语句用于根据表达式的值选择或执行特定的代码块。有时,会发生贯穿,这会导致预期和非预期的结果。

我们可以将贯穿分为两种:有意贯穿无意贯穿

无意贯穿

在使用 switch 语句时,无意贯穿 是更常见的问题。当开发人员忘记在每个 case 的末尾添加 break 语句时,就会发生这种情况,导致控制流继续执行后续 case。这通常会导致意想不到的结果和逻辑错误。

无意贯穿导致的问题

它会导致细微的 bug 和逻辑错误。假设开发人员忘记在每个 case 之后使用 break 语句。这可能会被忽视,导致意想不到的行为。结果将是意想不到的。

示例

让我们来看一个 C++ 程序来演示 无意贯穿

输出

Fallthrough in C++

说明

在这个程序中,有一个名为 "day" 的变量,表示一周中的天数。输入由用户获取并分配给 "day" 变量。它使用 switch 语句。该程序采用了无意贯穿,通过在除最后一个 case 之外的每个 case 之后使用 [[fallthrough]] 属性来表示。无意贯穿导致程序打印用户输入的天数,并继续打印后续的天数,而不会遇到 break 语句。

如果用户输入第 3 天,则应该只打印星期二,但在这里,从星期二到星期六的所有天数都打印出来了,因为没有 break 语句在完成 case 3 后立即停止控制流。因此,我们将这种贯穿称为无意贯穿。

有意贯穿

有意贯穿 意味着如果用户选择某个特定 case,开发人员不希望中断控制流。开发人员将通过使用有意贯穿获得所需的结果或输出。如果贯穿是有意贯穿,则程序中不会有任何问题或逻辑错误。

示例

让我们来看一个 C++ 程序来演示 有意贯穿

输出

Fallthrough in C++

说明

在这个程序中,一个名为 "month" 的变量表示一年中的月份。月份的值由用户获取。month 变量获取输入并使用 switch 语句。代码有效地将输入的月份分类为季节。如果给定某个月份,它会告诉剩余的月份以完成该季节。有意贯穿被应用于连接同一季节内的连续月份。

如果用户输入 3,它会打印三月、四月和五月,以及季节。这反映了给定月份这些季节之间的逻辑连续性。