#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在这里。
任何人都可以向我解释一下这让我感到困惑。
首先,仅由白空间(和注释)隔开的字符串文字被串联成单字符串。这发生在表达解析之前发生(例如,有关更多信息,请参见此翻译阶段参考)。这意味着表达式*(1+"AB" "CD"+1)
确实被解析为*(1+"ABCD"+1)
。
要记住的第二件事是,诸如 "ABCD"
之类的字符串文字确实是只读的 arrays ,因此,人们可以使用正常的数组折线,或者让它们衰减到指针到他们的第一个指针元素。
第三件事是,对于任何数组或指针p
和索引i
,表达式*(p + i)
等于p[i]
。这意味着*(1+"ABCD"+1)
(与*("ABCD"+2)
的确相同)与"ABCD"[2]
相同。这为您提供了字符串中的第三个字符。字符串中的第三个字符是'C'
。
在C中,相邻字符串文字(例如"AB" "CD"
)被串联。(这是一种便利性,可以轻松地通过多行分解长字符串,并启用某些功能,例如<inttypes.h>
中的PRIx64
等宏。)结果是"ABCD"
。
字符串文字是字符的数组。在大多数情况下,数组会自动转换为指向其第一个元素的指针。(例外是您想要实际数组的上下文,例如应用sizeof
。)因此,"ABCD"
成为A
字符的指针。
当将一个人添加到指针中(到数组中的元素)时,结果指向数组中的下一个元素。因此,1+"ABCD"
指向B
。和1+"ABCD"+1
指向C
。
然后*
操作员生产指针指向的对象,因此*(1+"ABCD"+1)
是C
字符,其值为C
。
在这里,switch(*(1+"AB" "CD"+1))
像switch(*(2+"ABCD"))
一样评估。* (2+"ABCD")
指向字符C
。这就是为什么您的代码输出为C is here
。
*(any thing)
被评估为指向字符串文字的指针。