考虑下面的代码(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;
    }
}


但是,如果将char d = 0更改为int d = 0,则编译器将开始针对重复的情况引发错误。


错误:案例值重复


我知道表达式'a' + 'b'应该计算为int,但我的观点是,这两次都应该引起重复的大小写错误。为什么不呢?

最佳答案

出现这种现象的原因是系统上'a'+'b'的值,在使用ASCII编码的系统上为195。该值高于127,这是带符号字符的系统上的最高char值。因此,编译器可以安全地忽略两个case标签。

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

如果将'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;
}


Demo.

关于c - 数据类型和切换案例语句解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42454074/

10-11 22:15
查看更多