rim*_*ire 4 c pointers switch-statement
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:C在这里.
任何人都可以向我解释这令我困惑.
Som*_*ude 11
首先,仅由空格(和注释)分隔的字符串文字连接成单个字符串.这在表达式解析之前发生(有关更多信息,请参阅此转换阶段参考).这意味着表达式*(1+"AB" "CD"+1)实际上被解析为*(1+"ABCD"+1).
要记住的第二件事是字符串文字"ABCD"是真正的只读数组,因此可以使用普通的数组索引,或者让它们衰减到指向第一个元素的指针.
第三件事是对于任何数组或指针p和索引i,表达式*(p + i)等于p[i].这意味着*(1+"ABCD"+1)(实际上是相同的*("ABCD"+2))是相同的"ABCD"[2].这将为您提供字符串中的第三个字符.字符串中的第三个字符是'C'.
在C中,连接相邻的字符串文字,例如"AB" "CD".(这是一个方便,允许长字符串可以很容易地分解在多行,使某些功能,如象宏PRIx64在<inttypes.h>工作了.)结果是"ABCD".
字符串文字是一个字符数组.在大多数情况下,数组会自动转换为指向其第一个元素的指针.(例外情况是在您需要实际数组的上下文中,例如应用sizeof.)因此"ABCD"成为指向该A字符的指针.
当一个添加到指针(到数组中的元素)时,结果指向数组中的下一个元素.所以1+"ABCD"指向B.并1+"ABCD"+1指向C.
然后*运算符生成指针指向的对象,字符*(1+"ABCD"+1)也是如此C,其值为C.