关于swtich的Case分支必须要用break结束的问题。

NetCobra 2003-03-06 04:58:09
在switch的每一个case分支中都需要加上break来退出switch,这是因为“当某个标签和switch的表达式值吻合时,该case标签之后的所有case标签也都会执行,除非我们明确使用break来结束执行动作。”(候捷《Essential C++》简体中文版P19)

关于为什么要把switch语句涉及成这个样子,《Essential C++》举了这样一个例子:

switch(next_char)
{
case 'a':case 'A':
case 'e':case 'E':
case 'i':case 'I':
case 'o':case 'O':
case 'u':case 'U':
++vowel_cnt;
break;
//...
}

但是书中没有讲解这个例子,我看不明白这个例子怎么能说明switch设计成这个样子的理由,哪位能给我讲一下吗?谢谢。
...全文
326 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
aitforever 2003-03-06
  • 打赏
  • 举报
回复
快作笔记阿!
macadam 2003-03-06
  • 打赏
  • 举报
回复
gz
Bandry 2003-03-06
  • 打赏
  • 举报
回复
我觉得很好看,哈哈,我喜欢C/C++
zry 2003-03-06
  • 打赏
  • 举报
回复
是啊,只有分行写了才可以,用goto语句会破坏程序的结构性
liao2001 2003-03-06
  • 打赏
  • 举报
回复
switch语句相当于:
if() goto 111;
if() goto 222;
if() goto 333;
...
111:
...
222:
...
333:
...

看看汇编代码就会明白的
langzi8818 2003-03-06
  • 打赏
  • 举报
回复
哈哈,不是折磨,我觉的很好呀
  • 打赏
  • 举报
回复
对,你理解正确,不过case ('a'||'A'||'e'||'E'||'i'||'I'||'o'||'O'||'u'||'U')好象是不行的:)
呵呵,你会习惯的。
NetCobra 2003-03-06
  • 打赏
  • 举报
回复
我明白了,这段程序就是说next_char只要是aeiou或者是AEIOU中的任何一个字符,都执行
++vowel_cnt,然后break退出,也就是说多个case分支共享相同的语句。

不过我觉得设计成
switch(next_char)
{
case ('a'||'A'||'e'||'E'||'i'||'I'||'o'||'O'||'u'||'U')
++vowel_cnt;
break;
//...
}
更明白一些


谢谢。

我现在非常痛恨C和C++的语法,感觉完全是为了最早的计算机设计的,能省下一个字母就要省一个字母,用惯了Delphi转到C++感觉完全是一种折磨:(
zhouzhaohan 2003-03-06
  • 打赏
  • 举报
回复
其实你看看最终实现的汇编代码就知道为什么这样了。
这是一种可以利用的特性,叫做fall through.
许多分支执行同样的处理的是时候可以避免将代码写很多遍,比如上面的例子
同时也有如下情况:
switch (interval.charAt(0))
{
case 'd': case 'D':
number *= 24 ; // days to hours
// fall through!
case 'h': case 'H':
number *= 60 ; // hours to minutes
// fall through!
case 'm': case 'M':
number *= 60 ; // minutes to seconds
// fall through!
case 's': case 'S':
number *= 1000 ; // seconds to milliseconds
break ;
default:
// If we get to here then the interval parameter
// didn't meet the d,h,m,s criteria. Handle
// the error.
alert(intervalMsg) ;
return null ;
}
可以将根据输入转换成毫秒数。这也充分利用了fall through 的特性,避免过多的hardcode.
magic8 2003-03-06
  • 打赏
  • 举报
回复
这个例子只是说明:只要符合上面的10个case中的任何一个都会执行
++vowel_cnt;
然后break;
这样可以简化代码。不需要每一个case都写++vowel_cnt;break;
wanghongit 2003-03-06
  • 打赏
  • 举报
回复
就是无论取到元音字母无论大小写都将vowel_cnt的值加1
lbaby 2003-03-06
  • 打赏
  • 举报
回复
也许是因为
还有下边的
case:

所有的case 都应该被执行

个人猜测而已

  • 打赏
  • 举报
回复
呵呵,这和
switch(next_char)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
++vowel_cnt;
break;
//...
}
没有本质的区别呀,只是case 'a':case 'A':两个case如果有代码的话是一样的,所以放在一起写:)
如:
case 'a':case 'A':{ ++i;} //大小写都加i

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧