error:case label does not reduce an integer constant

【本人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型的值,所以字符串当然不可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值