与字符串指针混淆

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'.


Eri*_*hil 6

在C中,连接相邻的字符串文字,例如"AB" "CD".(这是一个方便,允许长字符串可以很容易地分解在多行,使某些功能,如象宏PRIx64<inttypes.h>工作了.)结果是"ABCD".

字符串文字是一个字符数组.在大多数情况下,数组会自动转换为指向其第一个元素的指针.(例外情况是在您需要实际数组的上下文中,例如应用sizeof.)因此"ABCD"成为指向该A字符的指针.

当一个添加到指针(到数组中的元素)时,结果指向数组中的下一个元素.所以1+"ABCD"指向B.并1+"ABCD"+1指向C.

然后*运算符生成指针指向的对象,字符*(1+"ABCD"+1)也是如此C,其值为C.