#include<stdio.h>
int main()
{
switch(*(1+"AB" "CD"+1))
{
case 'A':printf("A is here");
break;
case 'B':printf("B is here");
break;
case 'C':printf("C is here");
break;
case 'D':printf("D is here");
break;
}
}
输出结果为:C就在这里。
任何人都可以向我解释这令我感到困惑。
答案 0 :(得分:11)
首先,仅由空格(和注释)分隔的字符串文字连接成单个字符串。这在表达式解析之前发生(有关更多信息,请参阅例如this translation phase reference)。这意味着表达式*(1+"AB" "CD"+1)
实际上被解析为*(1+"ABCD"+1)
。
要记住的第二件事是像"ABCD"
这样的字符串文字实际上是只读的数组,因此可以使用普通的数组索引,或让它们衰减到指向他们的第一个元素。
第三件事是,对于任何数组或指针p
和索引i
,表达式*(p + i)
等于p[i]
。这意味着*(1+"ABCD"+1)
(与*("ABCD"+2)
实际上相同)与"ABCD"[2]
相同。这将为您提供字符串中的第三个字符。字符串中的第三个字符是'C'
。
答案 1 :(得分:6)
在C中,连接相邻的字符串文字,例如"AB" "CD"
。 (这是一种方便,允许在多行上轻松分解长字符串,并使某些功能(如PRIx64
中的<inttypes.h>
等宏)能够正常工作。)结果为"ABCD"
。< / p>
字符串文字是一个字符数组。在大多数情况下,数组会自动转换为指向其第一个元素的指针。 (例外情况在您想要实际数组的上下文中,例如应用sizeof
。)因此"ABCD"
成为指向A
字符的指针。
当一个指针添加到指针(指向数组中的元素)时,结果指向数组中的下一个元素。因此1+"ABCD"
指向B
。 1+"ABCD"+1
指向C
。
然后*
运算符生成指针指向的对象,因此*(1+"ABCD"+1)
是C
字符,其值为C
。
答案 2 :(得分:2)
此处,switch(*(1+"AB" "CD"+1))
的评估方式与switch(*(2+"ABCD"))
类似。 * (2+"ABCD")
指向字符C
。这就是您的代码输出为C is here
的原因。
*(any thing)
被评估为指向字符串文字的指针。