看看下面的例子:
int main(){
char *s = "Hello";
switch (s[0]) {
case "Hello"[0]:
return 1;
case "Goodbye"[0]:
return 2;
default:
return 0;
}
}
编译此示例时,我收到一个错误,抱怨案例标签不是整数。但这似乎不正确,因为"..."[0]
解析为整数。
有人可以对此有所了解并解释为什么这段代码无法编译?
答案 0 :(得分:6)
案例标签需要是整数常量,而不是整数表达式。虽然表达式"Hello"[0]
可以在编译时计算到'H'
,但编译器不需要这样做。
C99标准,第6.8.4.2节,第3部分:
每个case标签的表达式应该是一个整型常量表达式,并且在同一个switch语句中没有两个case常量表达式在转换后应该具有相同的值。
答案 1 :(得分:0)
“Hello”是一个字符串文字。如果你想要字符串文字的第一个字符,那么你需要指定'H'这是一个单个字符。
case语句只能是一个整数或者可以变成整数的东西,它必须是一个常数。
请参阅switch语句中的本教程。enter link description here
答案 2 :(得分:0)
case标签应该是常量表达式,可以在编译时进行评估。 虽然看似合乎逻辑,但使用常量索引索引到字符串文字不是常量表达式。
这可以追溯到C(++)的类型系统。每个表达式都有一个静态类型。对于字符串文字,它是const char [],对于任何数组,它的值是一个指针,在编译时无法知道。 它填充了链接时间(考虑消除重复字符串文字的优化),如果全局优化无法解决,很可能会在生成的代码中找到间接。