【本人GitHub】:https://github.com/chesterblue/ 欢迎大家star
在LeetCode上刷题时,做到一个罗马数字转数字的题目,我想用switch case语句,但是却出现了编译错误:case label does not reduce an integer constant。
下面就是讲解
错误示例:
switch(c)
{
case "I":num+=1;break;
case "V":num+=5;break;
case "X":num+=10;break;
case "L":num+=50;break;
case "C":num+=100;break;
case "D":num+=500;break;
case "M":num+=1000;break;
}
正确答案:
switch(c)
{
case 'I':num+=1;break;
case 'V':num+=5;break;
case 'X':num+=10;break;
case 'L':num+=50;break;
case 'C':num+=100;break;
case 'D':num+=500;break;
case 'M':num+=1000;break;
}
https://docs.microsoft.com/en-us/cpp/c-language/switch-statement-c?view=vs-2017
上面这个网址是微软的C语言手册中所规定的switch语句的用法
可以看到case 后应该用constant-expression,再往下有一句关键的话,下图已划出。
意思是switch(expression)和case constant-expression 中的expression和constant-expression的类型必须是整数。
那么为什么我上面写的'I'、'V'不是整数也可以呢?原因就是在编译时会把switch(c)中的c以及case后的字符型值转化为int型的值。所以也就能解释为什么不能使用"I"、"V"等了,因为使用双引号存储的是字符串,而字符串最少为两位,因为最后一个是'\0',而字符串无法转换为int型的值,所以字符串当然不可以了。