考虑下面包含重复案例的代码(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
,但我的观点是它应该同时引发重复的大小写错误。为什么不呢?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
太长了,太迟了7分钟:P ...
我的猜测如下: char变量不能保存'a'+'b',这会导致溢出,即未定义的行为。 但是由于整数提升规则,'a'+'b'被提升为int。 char d永远不能等于这个值,编译器会完全删除这些情况。 int d可以等于两种情况,编译器会发出错误。
答案 2 :(得分:0)
重复案例错误意味着您已在switch语句中定义了两个具有相同值的案例。你可能正在考虑你的代码思维和#34;但它们都是不同的。"对你而言,他们是不同的。对于编译器,它们看起来大不相同。
您已使用字符表示法定义了case语句。单引号用于字符,而不是字符串。