如何从初始化列表返回值?替代Switch语句的实现可行性问询
不用数组变量,直接用初始化列表索引取值替代switch可行吗?
当然可行!你尝试的几种写法大部分都能达到目的,不过咱们得逐个掰扯清楚它们的合法性和注意事项:
第一种写法:
int X(int x) { return {1, 2, 3, 4}[x]; }这是C++11及以后支持的写法,本质是创建一个临时的原生数组,用初始化列表填充后直接通过下标访问。不过要注意:这种临时数组的类型是
int[4],编译器会自动推导。另外,必须保证x的取值在0~3之间,越界访问会触发未定义行为——就像你写switch没处理default分支一样,得自己做好输入校验。第二种写法:
你漏写了return关键字,修正后应该是:int X(int x) { return static_cast<std::array<int, 4>> ({1, 2, 3, 4})[x]; }这个是完全符合C++标准的写法!通过初始化列表构造一个临时的
std::array对象,然后用下标运算符取值。std::array比原生数组更安全,比如很多编译器的debug模式会对std::array的下标访问做越界检查,能帮你更早发现问题。第三种写法:
int X(int x) { return (int[])({1, 2, 3, 4})[x]; }这个用到了C99复合字面量,这并不是C标准里的特性,只是GCC、Clang等编译器提供的扩展支持。如果你的代码需要跨编译器兼容(比如用MSVC),这种写法可能会报错,所以不推荐在标准C代码里用它。
总的来说,如果你想写标准C代码,优先选第二种写法;如果追求简洁,第一种写法在支持C11及以上的编译器里也没问题。但不管用哪种,都要记得校验x的取值范围,避免越界踩坑!
内容的提问来源于stack exchange,提问作者Kyuubi
相关产品推荐
相关产品推荐

