切换案例表达式

use*_*464 1 c switch-statement

考虑一个表达式 *(1+"AB" "CD"+1)

这个表达的解决方案是什么?上面的表达式是C中的开关表达式.

*(2+"AB" "CD") --> *(2+"ABCD") --> ?
Run Code Online (Sandbox Code Playgroud)

在此之后我该怎么办?以下是代码段:

#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");
     }

}
Run Code Online (Sandbox Code Playgroud)

eva*_*itl 6

Casabance.

如果你有

char *cp;
int i;
Run Code Online (Sandbox Code Playgroud)

然后cp[i] == *(cp+i) == *(i+cp) == i[cp].

C11 6.5.2.1:

后缀表达式后跟方括号[]中的表达式是数组对象元素的下标名称.下标运算符[]的定义是E1 [E2]与(*((E1)+(E2)))相同.

和C11 6.5.6:

当一个具有整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型.如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式.

就编译器而言,字符串文字只是一个char指针.

两个字符串文字彼此相邻,自动连接成一个字符串文字:

C11 6.4.5:

在转换阶段6中,由任何相邻字符序列和相同前缀字符串文字标记指定的多字节字符序列被连接成单个多字节字符序列.

所以...... *(1+"AB" "CD"+1) == *(1+"ABCD"+1) == *("ABCD"+1+1)==*("BCD"+1) == "BCD"[1] == 'C'.