考虑下面的代码(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
标签。
由于值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;
}
Demo.
关于c - 数据类型和切换案例语句解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42454074/