在 C++ 中使用嵌套开关语句是一种不好的做法吗?
is it bad practice to use nesting switch statments in c++?
我一直在课堂上做一个项目,到目前为止我写的代码运行良好。我的代码的很大一部分使用嵌套的开关语句。虽然我将按照现在的方式转换它,但我想知道嵌套开关语句是否通常不受欢迎,以供将来参考。
正如您可能已经注意到的那样,因为您问过,它们并不是最容易遵循的事情,所以我通常会尽可能避免它们。
这并不意味着你不能做那种控制流 - 诀窍是将案例拆分为它们自己的功能。这让某人可以阅读顶级开关,理解它的分支和发生的情况(因为你当然会给你的函数起很好的描述性名称),然后他们可以根据需要依次检查每个函数以了解下一个级别。
为了避免以前不必要的函数调用成本,您可以将函数标记为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 语句在计算过程方面更"昂贵",因为每次从一个案例跳到另一个案例时,您都会强制汇编程序进行新的猜测(对于下一个指令将是什么)。如果您主要关心的是算法效率,请尝试尽可能少地使用。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在运行时检查继承是否只有一种类型和 void*
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 寻找一种更好的方法来表示无符号字符数组
- 我正在寻找一种优雅的方式来从元组向量创建tuple_element向量