error:case label does not reduce an integer constant

在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语句的用法

error:case label does not reduce an integer constant_第1张图片

可以看到case 后应该用constant-expression,再往下有一句关键的话,下图已划出。

error:case label does not reduce an integer constant_第2张图片

意思是switch(expression)和case constant-expression 中的expression和constant-expression的类型必须是整数。

那么为什么我上面写的'I'、'V'不是整数也可以呢?原因就是在编译时会把switch(c)中的c以及case后的字符型值转化为int型的值。所以也就能解释为什么不能使用"I"、"V"等了,因为使用双引号存储的是字符串,而字符串最少为两位,因为最后一个是'\0',而字符串无法转换为int型的值,所以字符串当然不可以了。

你可能感兴趣的:(error:case label does not reduce an integer constant)