面试题答案
一键面试常见类型限制
- 整型相关类型:包括
char
、short
、int
、long
及其对应的无符号类型等。这是因为switch
语句在底层实现上依赖于整型值的比较。例如:
char ch = 'a';
switch (ch) {
case 'a':
// 执行代码
break;
case 'b':
// 执行代码
break;
default:
// 执行代码
break;
}
这里 ch
是 char
类型,可以作为 switch
的参数。
- 枚举类型:枚举类型本质上也是整型,所以可以作为
switch
参数。例如:
enum class Weekday {
Monday,
Tuesday,
Wednesday
};
Weekday day = Weekday::Monday;
switch (day) {
case Weekday::Monday:
// 执行代码
break;
case Weekday::Tuesday:
// 执行代码
break;
default:
// 执行代码
break;
}
不支持的类型
- 浮点型:如
float
、double
等不可以作为switch
参数。因为浮点数在内存中的表示方式与整型不同,其比较操作的精度问题使得它不适合switch
语句的等值比较逻辑。例如:
// 以下代码会报错
float num = 3.14f;
switch (num) {
case 3.14f:
// 执行代码
break;
default:
// 执行代码
break;
}
- 字符串类型:
std::string
或 C 风格字符串(const char*
)不能作为switch
参数。switch
语句依赖于整型值的直接比较,而字符串比较涉及复杂的字符序列匹配,不符合switch
的设计初衷。例如:
// 以下代码会报错
std::string str = "hello";
switch (str) {
case "hello":
// 执行代码
break;
default:
// 执行代码
break;
}
编译器报错信息
不同编译器报错信息会有所不同,但大致意思是参数类型不支持用于 switch
语句。例如在 GCC 编译器下,对于浮点型参数,可能会报类似于 error: switch quantity not an integer
的错误;对于字符串参数,可能会报 error: type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ is not an integral type
等错误,提示类型不是整型。