在c

时间:2015-10-12 12:55:10

标签: c switch-statement

#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

2 个答案:

答案 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",因为它指向字符串文字中的第三个字符。