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
但我的观点是它应该同时引发重复的大小写错误.为什么不呢?
此行为的原因是'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)