回 帖 发 新 帖 刷新版面

主题:一道题关于switch

输入一个字符,如果是数字输出1;如果是大写字母则输出2;如果是小写字母输出3;如果是空格则输出4;如果是回车换行符号则输出5;是其他符号输出6.
main()
{
char c;
scanf("%c",&c);
switch(c)
{
 case '0'<=c&&c<='9':printf("c=%\n",'1');break;
 case 'A'<=c&&c<='Z':printf("c=%\n",'2');break;
 case 'a'<=c&&c<='z':printf("c=%c\n",'3');break;
 case  c==' ':       printf("c=%c\n",'4');break;
 case  c=='\n':      printf("c=%c\n",'5');break;
 default:            printf("c=%c\n",'6');break;
}
}

以下是错误信息:C:\Users\Administrator\Desktop\p50_3-10.c(8) : error C2051: case expression not constant
C:\Users\Administrator\Desktop\p50_3-10.c(9) : error C2051: case expression not constant
C:\Users\Administrator\Desktop\p50_3-10.c(10) : error C2051: case expression not constant
C:\Users\Administrator\Desktop\p50_3-10.c(11) : error C2051: case expression not constant
C:\Users\Administrator\Desktop\p50_3-10.c(12) : error C2051: case expression not constant
Error executing cl.exe.

p50_3-10.exe - 5 error(s), 0 warning(s)

回复列表 (共6个回复)

沙发

case 后面接的是立即数,而不是表达式

板凳

switch 一个能转换为int类型的变量
 case int long char等等同于整数的常量值(这就是为什么不能写表达式)

3 楼

有的语言确实可以像楼主那样写(印象中Visual Basic 6.0就可以),但是C/C++不可以。

C/C++的case必须是在编译时可以确定的整数(包括char, short, int, long等等,signed和unsigned都可以,常数表达式也可以,比如case 3+2*5是可以的)。不能是运行之时才能计算得到的数。不能是浮点数、字符串、自定义类型。

楼主所写的case '0'<=c&&c<='9',这里因为c的值无法在编译时确定,所以case '0'<=c&&c<='9'这个表达式的值也无法在编译时计算出来,于是编译就失败了。错误信息“case expression not constant”正是在告诉我们,这个表达式无法在编译时计算出它的值。

C/C++的switch不是为了让程序员省事才设计的,它的存在是为了速度。之所以有那么多的限制,其实是为了便于优化,产生更加高效的程序。C语言中,如果分支较多,且各种分支出现的概率差别不大,则switch语句往往能比if-else语句运行得更快。不过有些场合确实无法使用switch(比如楼主的这种情况),这时可以用if语句代替。

4 楼

书上是if-else语句做的,我想用switch语句做试试。可惜不行!还是谢谢诸位了!

5 楼

switch语句对于需要对大量情况进行判断场合来说实现起来很累,即使要用switch做一般也是先把字符转化成标志值再处理

6 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册