一个关于switch语句的问题?

wang_qiao_ying 2010-03-27 10:03:44
int main(void)
{
char ch;
int v1, v2;

while((ch = getchar()) != '#')
{
switch(ch)
{
case 'a' :
case 'h' :
default : v1++;
case 'o' : v2++;
}

}
printf("%d,%d\n", v1, v2);
return 0;
}
输入:china# 结果怎么是5,5 ???
...全文
196 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
soon 2010-03-30
  • 打赏
  • 举报
回复
错了.应该为int (*p[])()
soon 2010-03-30
  • 打赏
  • 举报
回复
在有些地方,sswitch语言显得力不从心.用一个函数指针数组吧.
如int(*int[])()
lvjaio5241 2010-03-29
  • 打赏
  • 举报
回复
一个是没有给V1,V2初始化,
一个是SWITCH(CH)有问题
wingzero520 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wang_qiao_ying 的回复:]

不好意思,我忘记把V1和V2初始化了,应该是V1=0;V2=0;
至于没有没有break那是程序故意设计的,就是想考察对switch的认识,
我就是不明白那个case 'o':V2++ 为什么被执行了五次,也没有输入'o',怎么还会执行这个分支啊?
[/Quote]

case 'o'上面有个default:,而且后面又没break;
当然无论是什么字符最终都会执行一遍case 'o'后面的内容;

wang_qiao_ying 2010-03-29
  • 打赏
  • 举报
回复
不好意思,我忘记把V1和V2初始化了,应该是V1=0;V2=0;
至于没有没有break那是程序故意设计的,就是想考察对switch的认识,
我就是不明白那个case 'o':V2++ 为什么被执行了五次,也没有输入'o',怎么还会执行这个分支啊?
cxzabc 2010-03-28
  • 打赏
  • 举报
回复
荆轲是个水货
白杨湖 2010-03-28
  • 打赏
  • 举报
回复
貌似楼至比我还水~~~
难道是水货!
jbz001 2010-03-28
  • 打赏
  • 举报
回复
这代码写得太有意思了,V1和v2都没初始化,每个case后面也没有break
东大坡居士 2010-03-28
  • 打赏
  • 举报
回复
比如ch为a,则case a匹配,但是因为没有break,所以还会继续执行,直到把所有的case都执行完
喜-喜 2010-03-28
  • 打赏
  • 举报
回复
少了break,你的每个case分支都按顺序执行了!
ameyume 2010-03-28
  • 打赏
  • 举报
回复
v1, v2没有初始化
default应该放在所有case的而后面吧
至少要加一个break;
某某9 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 go_michael 的回复:]

case分句后没有break
[/Quote]break
peng324 2010-03-28
  • 打赏
  • 举报
回复
int main(void)
{
char ch;
int v= 0,v2=0;

while((ch = getchar()) != '#')
{
switch(ch)
{
case 'a' : break;
case 'h' : break;
case 'o' : v2++,break;
default : v1++,break;
}

}
printf("%d,%d\n", v1, v2);
return 0;
}
就这样,一是switch的case语句结束没有break语句,这样每个case语句都会执行,还有v1、v2要初始化,根据你的需要。这样可以吧?
ahui5252 2010-03-27
  • 打赏
  • 举报
回复
没加break,并且没输入o,所以最起码switch里的语句是从default开始执行,而且无break,所以接下执行。因此两个值自加次数相同。。。
febbird1984 2010-03-27
  • 打赏
  • 举报
回复
有些情况下会故意省略掉break
但是这里应该每个case后都要加个break
不加的话,执行完当前case以后还会继续执行下一个case
maildaty 2010-03-27
  • 打赏
  • 举报
回复
你没break;而且你的变量v1 v2没有赋初值啊,这样很危险的:

int main(void)
{
char ch;
int v1, v2;
v1 = 0;
v2 = 0;

while((ch = getchar()) != '#')
{
switch(ch)
{
case 'a' :
case 'h' :
default : v1++;
case 'o' : v2++;
}
}
printf("%d,%d\n", v1, v2);
return 0;
}
cy330206 2010-03-27
  • 打赏
  • 举报
回复
晕死楼上们的速度真是太快了,,,楼主这个可以结贴了,,回答者都应该得到分,呵呵
cy330206 2010-03-27
  • 打赏
  • 举报
回复
没有break
xiuxianshen 2010-03-27
  • 打赏
  • 举报
回复

switch(ch)
{
case 'a' :
case 'h' :
default : v1++;
case 'o' : v2++;
}

改成

switch(ch)
{
case 'a' :
break;
case 'h' :
break;
case 'o' :
v2++;
break;
default :
v1++;
break;
}
go_Michael 2010-03-27
  • 打赏
  • 举报
回复
case分句后没有break
加载更多回复(2)

69,382

社区成员

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

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