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

时间:2017-02-25 09:07:10

标签: 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;
    }
}

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

  

错误:重复案例值

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

3 个答案:

答案 0 :(得分:6)

此行为的原因是系统上'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.

答案 1 :(得分:1)

太长了,太迟了7分钟:P ...

我的猜测如下: char变量不能保存'a'+'b',这会导致溢出,即未定义的行为。 但是由于整数提升规则,'a'+'b'被提升为int。 char d永远不能等于这个值,编译器会完全删除这些情况。 int d可以等于两种情况,编译器会发出错误。

答案 2 :(得分:0)

重复案例错误意味着您已在switch语句中定义了两个具有相同值的案例。你可能正在考虑你的代码思维和#34;但它们都是不同的。"对你而言,他们是不同的。对于编译器,它们看起来大不相同。

您已使用字符表示法定义了case语句。单引号用于字符,而不是字符串。