与字符串指针混淆 #包括 int main() { 开关(*(1+AB+CD+1)) { 案例“A”:printf(“A在这里”); 打破 案例“B”:printf(“B在这里”); 打破 案例“C”:printf(“C在这里”); 打破 案例“D”:printf(“D在这里”); 打破 } }

与字符串指针混淆 #包括 int main() { 开关(*(1+AB+CD+1)) { 案例“A”:printf(“A在这里”); 打破 案例“B”:printf(“B在这里”); 打破 案例“C”:printf(“C在这里”); 打破 案例“D”:printf(“D在这里”); 打破 } },c,pointers,switch-statement,C,Pointers,Switch Statement,输出是:C在这里 有谁能解释一下这让我很困惑。这里,开关(*(1+“AB”“CD”+1))的计算方法与开关(*(2+“ABCD”))类似。*(2+“ABCD”)指向字符C。这就是为什么您的代码的输出是C在这里 *(任何事物)被计算为指向字符串文本的指针 首先,仅由空格(和注释)分隔的字符串文本被连接到单个字符串中。这发生在表达式解析之前(如需更多信息,请参阅)。这意味着表达式*(1+“AB”“CD”+1)实际上被解析为*(1+“ABCD”+1) 要记住的第二件事是,像“ABCD”这样的字符串文字

输出是:C在这里

有谁能解释一下这让我很困惑。

这里,
开关(*(1+“AB”“CD”+1))
的计算方法与
开关(*(2+“ABCD”))类似。
*<代码>(2+“ABCD”)指向字符
C
。这就是为什么您的代码的输出是
C在这里


*(任何事物)
被计算为指向字符串文本的指针

首先,仅由空格(和注释)分隔的字符串文本被连接到单个字符串中。这发生在表达式解析之前(如需更多信息,请参阅)。这意味着表达式
*(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
)工作。)结果是
“ABCD”

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

将一个元素添加到指针(指向数组中的元素)时,结果将指向数组中的下一个元素。因此
1+“ABCD”
指向
B
。而
1+“ABCD”+1
指向
C


然后
*
操作符生成指针指向的对象,因此
*(1+“ABCD”+1)
C
字符,其值为
C

*(1+“AB”“CD”+1)
*(1+“ABCD”+1)
*(“ABCD”+2)
*(
C
。切换不重要。@Stargateur这应该是一个答案。这是为了某个测试、考试或面试问题吗?好吧,我们至少不需要礼貌地解释这段代码不是“为了现实世界”,如果OP看不到这一点,我们会故意混淆它。我不反对在事后结束这样一个问题。@underline\u d:这不是我所说的模糊问题。这些问题被用来探究学生或求职者是否真正学会了编程语言,而不仅仅是模糊地熟悉模式。相反,它们可以用来说明语言概念,因为它们揭示了语言规范的细节,从而引发对语言的分析思考。所以“ABCD”变成了指向字符的指针。“不,”ABCD“是一种字符类型[5],而不是指针。数组衰减为指针,但不会变成指针。@Stargateur:我的措辞是正确的。首先,“衰变”并没有出现在C标准中,只是作为一个关于原子变量的笑话。计算表达式时,数组将转换为指向其第一个元素的指针。因此,我们正在处理的值成为指向第一个元素的指针,就像
4*5+3
中的
4*5
在表达式求值过程中变成20一样。C标准本身就是这样使用“变成”的。你错了,除了“衰变”这个词,但它更容易说<代码>“ABCD”
是一个数组,永远不会是指针,
“ABCD”+0
是指针。很容易证明
sizeof“ABCD”==5
sizeof(“ABCD”+0)==sizeof(char*)
@Stargateur:been的这种用法是典型的英语。在讨论表达式评估时,它指的是我们正在使用的值;这并不意味着原始对象本身会改变。C标准本身使用这种语言,就像它说的“正常的长双精度值在转换为双精度值时可能会低于正常值”。在这种情况下,原始值不变;动词“been”讨论表达式求值过程中发生的更改。@Stargateur在任何表达式中,字符串文字都成为指向其第一个元素的指针;它的实际类型(或
sizeof
将返回的内容等)在表达式中不再相关。所以“So”ABCD“变成了指向a字符的指针。”是一个正确的短语。如果您对“beans”的反对意见是“no,字符串文字不变”,那么同样的反对意见也同样适用于单词“decadys”。
#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;
    }
}