#include<stdio.h>
void 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");
}
}
我怀疑是在switch语句中为什么它只取字符串中的第一个字母ascii值("AB"
"CD"
)? (此处它采用'A'
ascii值,然后65+1+1
,因此它是67
ascii 'C'
的值。
内部正在进行什么操作?
请有人解释这个开关案例。 Thanq
答案 0 :(得分:4)
这段代码没有任何意义,因为switch表达式是常量。
*(1+"AB" "CD"+1)
首先完成连接任何相邻字符串文字的翻译步骤,因此它变为
*(1 + "ABCD" + 1)
相当于
*("ABCD" + 2)
在此上下文中,字符串文字被计算为指向其第一个元素的char *
指针。现在你将该指针递增2,因此它指向第3个字母C
,然后取消引用它。
答案 1 :(得分:2)
那段代码是无稽之谈。它是一个花哨的技巧,但由于编译器如何评估它,你可以替换
switch(*(1+"AB" "CD"+1)){
直接用
switch('C'){
完全否定了switch
语句的原因。
补充说明:
*(anything)
被评估为指向字符串文字的指针。
编译器(感谢Mr.Oehm指出它不是预处理器)自动将"AB"
"CD"
合并到"ABCD"
1 + Anything + 1
被评估为Anything + 2
最后。 "ABCD" + 2
对于switch语句等于"C"
,因为它指向字符串文字中的第三个字符。