数据类型和switch-case语句解析

Shu*_*sia 2 c types duplicates switch-statement

考虑下面包含重复案例的代码(C语言).编译器这次没有给出任何警告/错误.

void testSwitchCase() {
char d = 0;
switch(d) {
  case 'a' + 'b':
       printf("I am case 'a' + 'b'\n");
       break;
  case 'a' + 'b':
       printf("I am case 'a' + 'b' \n");
       break;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我 char d = 0改为int d = 0,编译器会开始引发有关重复案例的错误.

错误:重复案例值

我理解表达式'a' + 'b'应该评估为a int但我的观点是它应该同时引发重复的大小写错误.为什么不呢?

das*_*ght 6

此行为的原因是'a'+'b'系统上的值,在具有ASCII编码的系统上为195.这大于127,是char具有签名字符的系统上的最高值.因此,编译器安全地忽略这两个case标签.

由于值195在范围内int,编译器不能再忽略它,因此它必须发出重复的大小写错误.

如果你'a'+'b'改为'0'+'1',你得到97,这是在一个签名字符的范围内,你char d也会得到重复的案例错误:

char d = 0;
switch(d) {
case '0' + '1':
   printf("I am case 'a' + 'b'\n");
   break;
case '0' + '1':
   printf("I am case 'a' + 'b' \n");
   break;
}
Run Code Online (Sandbox Code Playgroud)

演示.