注册 登录
编程论坛 C++教室

请帮忙看看这段程序怎么理解!

小说贝斯 发布于 2007-12-27 12:45, 2761 次点击
#include<iostream.h>
 void main()
 {
     int score,s,sum;
     char grade;
     cout<<"please input score "<<endl;
     cin>>score;
     if(score>=0&&score<=100)
     {
         s=score/10;
         switch(s)
         {
             case 0:
             case 1:
             case 2:
             case 3:
             case 4:
             case 5: grade='2';break;
             case 6:
             case 7: grade='3';break;
             case 8: grade='4';break;
             case 9:
             case 10: grade='5';break;
         }
         cout<<"grade is "<<grade<<endl;
     }
     else
         cout<<"data error\n";
 }
这是一个把百分制成绩按照五分制输出的程序,用switch写的!可是我不太明白case那段代码。比如我输入20,为什么也显示2,输入30也显示2!请知道的解释下具体原因!
16 回复
#2
Lonelie2007-12-27 15:31
switch-case语句的执行过程是:
从第一个case语句开始,直到遇到break跳出
#3
小说贝斯2007-12-27 17:23
原帖由 [bold][underline]Lonelie[/underline][/bold] 于 2007-12-27 15:31 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1162271&ptid=194594][/url]
switch-case语句的执行过程是:
从第一个case语句开始,直到遇到break跳出

恩,你说的我明白,但是我想知道的是为什么case0,case1,case2等后面没有写grade='2';break;也能输出‘2’!应该是我没有表达清楚吧!我是个新手,对这不明白!希望会的朋友不要只做过客!
#4
pzj6364842007-12-27 18:44
case0,case1,case2 等后没有break,故程序向下顺序执行,直到有break语句跳出
#5
guojias9232007-12-27 18:46
我也是新手,不过这个程序还是看得懂的,
问题的关键是出在这段代码:
             case 0:
             case 1:
             case 2:
             case 3:
             case 4:
             case 5: grade='2';break;
当你用分数除以10后,所得的整形值会与"S"配对,当配对后程序运行到当对应的case(n)后会检查,是否在这个分支里结束(break),你这段代码在s<5这前,程序都会运行到case 5才结束.所以你输入的成绩小于60时都会输出"2"
如果你需要设置那么多的成绩等级,可以在每个case (s)后面 加grade=s;break.





#6
Lonelie2007-12-28 09:25
ls说的很清楚
#7
xiangz90252007-12-28 12:49
我想问一下,尽管程序这样写看起来很简洁,但是是不是效率会比加入break低啊!新手请教!
#8
kidd20052007-12-28 16:46
按道理就应该是比加入BREAK低了,因为是顺延下去检查有没有BREAK语句,
我也是新手,说得不对要尽快向我指出啊
#9
中学者2007-12-28 18:06
每个case加上break就不正常了.
#10
wch271492007-12-28 19:39
回复 1# 的帖子
我也是刚学switch结构,刚才看书:当几个case有共同的code的时候,可以只写一个case而其他的用空白。就像你写的,如果前5个都用空白,就会都用第六个的code。所以才会输入20,显示2,输入30也显示2。
#11
xzx10020022007-12-28 20:08
学习语言关键是要学习实质性的东西,不要流于肤浅。

c++也是顺序执行的语言,也就是说。循规蹈矩,一句一句按顺序执行。除非遇到一些特殊的跳转语句,执行顺序才可能发生变化。例如:return,break,goto等等。

而break的语句的含义是结束该层,就是说该层后面的语句不会在执行了。

进入switch语句后,程序首先找到相应的分支,即case语句,然后也是按顺序执行,到break时按其语义结束switch层。如果switch后没有break控制的话就和一般的语句一样,依次执行。其实switch语句就是多个if语句的组合。
#12
wch271492007-12-28 21:34
恩,ls说的很对
#13
StarWing832007-12-29 02:49
所以,这样因为没有跳转,反而提高了效率。
#14
keloy2008-01-05 22:54
我也说下下啊,0~5 2级 6~7 3级 8 4级 9~10 5级

如果是我我就不会用switch 主要是判断过多
#15
StarWing832008-01-10 11:36
其实啊,switch的内部(汇编)实现和if还有点不一样。似乎是基于跳转表实现的,大家可以编译的时候指定生成asm文件看看。应该来说是比一连串if效率要高些的,要不然就没有存在的必要了……
#16
忘记喧嚣2008-01-10 13:13
我想问一下,尽管程序这样写看起来很简洁,但是是不是效率会比加入break低啊!新手请教!

回答这个:那你要看你实现的是什么啊..他前面 几个分数都是一个等级.这样写就不会说效率变低.了.
#17
zhouqingwuji2008-01-10 15:34
全都有道理哈?既然这样我看也解释得差不多了?就顶一下吧!~·~
1