在 C++ 中使用嵌套开关语句是一种不好的做法吗?

is it bad practice to use nesting switch statments in c++?

本文关键字:一种 C++ 嵌套 开关 语句      更新时间:2023-10-16

我一直在课堂上做一个项目,到目前为止我写的代码运行良好。我的代码的很大一部分使用嵌套的开关语句。虽然我将按照现在的方式转换它,但我想知道嵌套开关语句是否通常不受欢迎,以供将来参考。

正如您可能已经注意到的那样,因为您问过,它们并不是最容易遵循的事情,所以我通常会尽可能避免它们。

这并不意味着你不能做那种控制流 - 诀窍是将案例拆分为它们自己的功能。这让某人可以阅读顶级开关,理解它的分支和发生的情况(因为你当然会给你的函数起很好的描述性名称),然后他们可以根据需要依次检查每个函数以了解下一个级别。

为了避免以前不必要的函数调用成本,您可以将函数标记为inline,以使编译器有效地将函数的主体复制到调用站点。

它最终看起来像这个令人难以置信的通用和不完整的骨架:

int main() {
    int thing;
    char second_level_thing;
    // various code which produces thing and second_level_thing
    switch (thing) {
    case 0: do_zero_case(second_level_thing); break;
    case 1: do_one_case(); break;
    default: do_default_case(); break;
    }
    // the rest of main
}
inline void do_zero_case(char second_level_thing) {
   switch (second_level_thing) {
     case 'a': // 0 -> a branch code
     // etc...
   }
}
// etc...

不要调用你的函数,比如do_zero_case!根据它的实际作用来命名它们。

我想补充一点,如果多个级别正在检查相同的值,那么就会发生一些非常奇怪的事情。

通过使用 OOP 技术(各种形式的虚拟方法调用)、模板、高阶函数等,还可以使用替代控制流。有时,一两个漂亮的简单switch语句正是您所需要的!

一般来说,if 和 switch 语句在计算过程方面更"昂贵",因为每次从一个案例跳到另一个案例时,您都会强制汇编程序进行新的猜测(对于下一个指令将是什么)。如果您主要关心的是算法效率,请尝试尽可能少地使用。

相关文章: