鱼C论坛

 找回密码
 立即注册
查看: 1681|回复: 4

[已解决]小白问关于case的问题

[复制链接]
发表于 2020-2-15 13:39:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想问下 case后面的常量表达式有什么要求吗,比如下面这种ABCD为什么要加单引号,后面是数字就不用加,能解释下原因吗,数字加了单引号就错误,字母不加也会错误
  1. #include <stdio.h>
  2. void main ()
  3. {
  4.         char  grade;
  5.         printf("grade=");
  6.         scanf("%c",&grade);
  7.         switch(grade)
  8.         {
  9.         case 'A':printf("85~100");break;
  10.         case 'B':printf("70~84");break;
  11.         case 'C':printf("60~69");break;
  12.         case 'D':printf("<60");break;
  13.         default : printf ("error \n");
  14.         }

  15. }
复制代码
  1. #include <stdio.h>
  2. void main ()
  3. {        
  4.         int year, month , day , sum ,leap;
  5.         printf("please input year ,month , day \n");
  6.         scanf("%d%d%d",&year,&month,&day);
  7.         switch(month)
  8.         {
  9.         case 1:sum=0;break;
  10.         case 2: sum=31;break;
  11.         case 3: sum =59;break;
  12.         case 4: sum =90;break;
  13.         case 5 : sum =120;break;
  14.         case 6:  sum =151;break;
  15.         case 7: sum =181;break;
  16.         case 8: sum =212;break;
  17.         case 9: sum =243;break;
  18.         case 10: sum =273;break;
  19.         case 11: sum=304;break;
  20.         case 12: sum =334;break;
  21.         default:printf("data error");break;
  22.         }

  23. sum =sum+day;
  24. if((year%400==0)||(year%4==0&&year%100!=0))
  25.         leap=1;
  26. else
  27. leap=0;
  28. if (leap==1&&month>2)
  29. sum++;
  30. printf("%d",sum);
  31. }
复制代码
最佳答案
2020-2-15 13:49:18
case后面只能是整型或字符型的常量或常量表达式
至于为什么,就好像为啥红灯停绿灯行,这个有些就是这么规定的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-15 13:49:18 | 显示全部楼层    本楼为最佳答案   
case后面只能是整型或字符型的常量或常量表达式
至于为什么,就好像为啥红灯停绿灯行,这个有些就是这么规定的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-15 13:49:33 | 显示全部楼层
因为字符必须加引号,这就是C语言的规则
下面的代码是因为你读取的是数字,所以case前面也必须是数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-15 14:16:06 | 显示全部楼层
本帖最后由 major_lyu 于 2020-2-15 14:19 编辑

case 后面的常量数据类型必须与所在的switch()括号中的变量类型一致。

上面的程序switch(grade)中,grade定义的是char类型,因此对应的case 语句的常量数据必须为字符常量,而字符常量的表示形式就是字符加单引号。

下面的程序中switch(month)中,month是int型数据,因此,后面的case语句的常量必须为整型常量,数字加了引号就变成字符常量了,与switch中的month类型不符自然就错了啊。

另外,通常情况下,为了能够明确的控制switch中的可用条件,switch中会用枚举类型作为变量,这时case语句也必须是对应的枚举类型的常量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-15 15:04:32 | 显示全部楼层
switch()括号里面要放整型数据或者是枚举型、布尔型和字符常量,后面三者实际上都是有相应的整数与之对应(bool的true就是1,false就是0;字符的’a'是97)。case后面好像要接那啥整型的常量,比如1、2、3、‘a'等,switch()括号的grade被对应为相应的数字,下面case的后面要用’A‘代表数字65,而你把1缓存’1‘,照理说是不会有错的(我试了你的代码,把1换成’1‘,不会出错),可能是你哪里出现错误了,或者符号中英文没搞好。(如有错误,请指正)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表