C中的switch和字符串文字字符

时间:2013-05-25 02:39:24

标签: c

看看下面的例子:

int main(){
        char *s = "Hello";
        switch (s[0]) {
                case "Hello"[0]:
                        return 1;
                case "Goodbye"[0]:
                        return 2;
                default:
                        return 0;
        }
}

编译此示例时,我收到一个错误,抱怨案例标签不是整数。但这似乎不正确,因为"..."[0]解析为整数。

有人可以对此有所了解并解释为什么这段代码无法编译?

3 个答案:

答案 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 [],对于任何数组,它的值是一个指针,在编译时无法知道。 它填充了链接时间(考虑消除重复字符串文字的优化),如果全局优化无法解决,很可能会在生成的代码中找到间接。