2

看看下面的例子:

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

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

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

4

3 回答 3

6

案例标签需要是整数常量,而不是整数表达式。尽管表达式 "Hello"[0]可以在编译时计算为'H',但编译器不需要这样做。

C99 标准,第 6.8.4.2 节,第 3 部分:

每个 case 标签的表达式应为整数常量表达式,并且同一 switch 语句中的任何两个 case 常量表达式在转换后都不应具有相同的值。

于 2013-05-25T02:43:53.073 回答
0

“Hello”是一个字符串文字。如果您想要字符串文字的第一个字符,则需要指定“H”,它是单个字符。

case语句只能是整数或可以变成整数的东西,并且它需要是一个常量。

请参阅有关 switch 语句的本教程。在此处输入链接描述

于 2013-05-25T02:44:15.673 回答
0

case 标签应该是常量表达式,可以评估编译时间。虽然看起来合乎逻辑,但使用常量索引对字符串文字进行索引并不是一个常量表达式。

这可以追溯到 C(++) 的类型系统。每个表达式都有一个静态类型。对于字符串字面量是 const char[] ,对于任何数组来说,它的值都是一个指针,在编译时是无法知道的。它填充了链接时间(考虑消除重复字符串文字的优化),如果全局优化无法解决它,您很可能会在生成的代码中找到间接性。

于 2013-05-25T02:51:23.970 回答