如果条件语句与正则C表达式中的类型转换不同,则类型转换是否也不同? #包括 int main() { 开关(*(1+AB+CD+1)) { 案例A:printf(“低俗小说”); 打破 案例B:printf(“12个愤怒的人”); 打破 案例C:printf(“卡萨班斯”); 打破 案例D:printf(“血钻”); } 返回0;
} 这是一个C代码,它根据给定字符串中的第三个字符给出输出。 “AB”“CD”给卡萨班斯,“AB”“DD”给血钻。 我想知道switch语句中的表达式是如何计算的 我尝试了另一个代码如果条件语句与正则C表达式中的类型转换不同,则类型转换是否也不同? #包括 int main() { 开关(*(1+AB+CD+1)) { 案例A:printf(“低俗小说”); 打破 案例B:printf(“12个愤怒的人”); 打破 案例C:printf(“卡萨班斯”); 打破 案例D:printf(“血钻”); } 返回0;,c,string,string-literals,C,String,String Literals,} 这是一个C代码,它根据给定字符串中的第三个字符给出输出。 “AB”“CD”给卡萨班斯,“AB”“DD”给血钻。 我想知道switch语句中的表达式是如何计算的 我尝试了另一个代码 #include<stdio.h> int main() { switch(*(1+"AB""CD"+1)) { case'A':printf("Pulp Fiction"); break; case'B':printf("12
#include<stdio.h>
int main()
{
switch(*(1+"AB""CD"+1))
{
case'A':printf("Pulp Fiction");
break;
case'B':printf("12 Angry Man");
break;
case'C':printf("Casabance");
break;
case'D':printf("Blood Diamond");
}
return 0;
#包括
int main()
{
常量字符ch=*(1+“AB”“AD”+1);
printf(“%c”和“ch”);
返回0;
}
这段代码为我对字符串所做的任何更改提供了一个输出“f”。
我想知道这个表达式是如何计算的
为什么上述两种代码不同呢?这里有一个重要的错误
#include<stdio.h>
int main()
{
const char ch=*(1+"AB""AD"+1);
printf("%c",&ch);
return 0;
}
将打印ch
的地址,但如果要打印字符,请执行以下操作
printf("%p", (void *) &ch);
另外,
1+“AB”“CD”+1
是一种荒谬的书写方式,请原谅我写“ABCD”+2
它没有错,而且100%有效,但它让你思考为什么,为什么有人会浪费时间做这件事?在这个转换语句中
printf("%c", ch);
const char ch=*(1+"AB""AD"+1);
printf("%c",&ch);
首先,编译器将字符串文本“AB”和“CD”连接在一起,其结果如下所示
switch(*(1+"AB""CD"+1))
字符串文字存储为以零结尾的字符数组。例如,在C字符串文字>代码> ABCK“< /Cord>”中有类型<代码> char [5 ] < /C>(在C++字符串中有常数字符数组的类型。因此C++中的字符串文字<代码>”ABCD“< /Cord>”有类型<代码> const char [5 ] < /> >)
表达式中的数组隐式转换为指向数组的第一个字符的指针
因此,在这个表达式中,1+“ABCD”+1
可以写得更简单,如
switch(*(1+"ABCD"+1))
或
这里使用了所谓的指针算法。表达式的结果是指向字符串文本的第三个元素的指针,其类型为char*
因此,应用解引用可以得到字符串文字的第三个字符
在这个代码片段中
"ABCD" + 2
使用相同的字符串文字和类型为const char
的对象ch
,该对象由字符串文字的相同第三个字符初始化
但在声明中,
printf("%c", ch);
const char ch=*(1+"AB""AD"+1);
printf("%c",&ch);
您正在尝试将对象的地址作为字符输出。只要写就对了
printf("%c",&ch);
您的代码调用未定义的行为,您无法可靠地预测它的输出。@iharob我认为这里不是这种情况<代码>“AB”“CD”只是一个字符串文字,因此,它有一个清晰的类型(
const char*
),并且有明确的规则如何将其添加到整数文字中并向其添加整数文字。@MarcusMüller请阅读我的答案。啊,您指的是printf
语句,而不是实际的开关
条件?“AB”“CD”
与相同。添加2将指向第三个字符。您能指出错误吗?表达式是如何计算的吗?@jeet该错误与表达式无关,它与const char*sting=“ABCD”;开关(字符串[2])
。我已经编写了(1+“AB”“CD”+1)只是为了检查数字是否正常相加。在Java中,表达式是根据字符串进行类型转换的。例如out.print()语句中的“A”+1会将1转换为字符串类型。如果不是,则会将1转换为字符串类型。Java和c是非常不同的语言,您需要阅读指针算术的相关内容“有类型<代码> const char */COD>,不是<代码> char []/COD>,损坏了吗?@ C字符串中的McCurmüLLLE具有非恒定字符数组的类型,而在C++中,它们确实具有常数字符数组的类型。这道题被标为C题,不是吗?
printf( "%c", ch );