搜索
查看: 1085|回复: 9
打印 上一主题 下一主题

我算的是7,6,但答案是5,5,怎么分析?

[复制链接]
跳转到指定楼层
楼主
发表于 2013-12-8 00:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
运行以下程序后,如果从键盘上输入china#<回车>,
则输出结果为
   #include <stdio.h>
   main( )
   { int v1=0,v2=0;
     char ch;
     while ((ch=getchar( ))!='#')
       switch(ch)
       { case 'a':
         case 'h':
         default: v1++;
         case 'o': v2++;
       }
       printf("%d,%d\n",v1,v2);
    }

最佳答案

查看完整内容

不要管你之前学的是什么,跟着我的思路来 1. while循环一共执行几次? 2. 无论switch后的语句块怎么执行,其中一句语句有没有可能在一次选择中执行两次?(当然,不考虑goto) 第一个问题应该没有问题,是5次; 如果一句语句只能执行一次,那么v1和v2的值有没有可能大于5? 教科书和教师所教授的东西一般都是加过自己的理解的,但是有时候还不如标准中的说法好理解 switch的语义是,一个语句块中,从哪里开始执行 例 ...
沙发
发表于 2013-12-8 00:36:24 | 只看该作者
不要管你之前学的是什么,跟着我的思路来

1. while循环一共执行几次?
2. 无论switch后的语句块怎么执行,其中一句语句有没有可能在一次选择中执行两次?(当然,不考虑goto)

第一个问题应该没有问题,是5次;
如果一句语句只能执行一次,那么v1和v2的值有没有可能大于5?

教科书和教师所教授的东西一般都是加过自己的理解的,但是有时候还不如标准中的说法好理解
switch的语义是,一个语句块中,从哪里开始执行
例如

  1. int expr = 1;
  2. switch(expr){
  3. case 1:
  4. case 2:
  5. case 3:
  6.   i += 1;
  7.   i -= 2;
  8.   i *= 3;
  9. }
复制代码
不管case标签是怎么分布的,不管标签后面有没有语句,有没有default break这些东西,标签第一次匹配后,这些标签在这次运行中就不再考虑了,语句块等价于

  1. {
  2.     i += 1;
  3.     i -= 2;
  4.     i *= 3;
  5. }
复制代码
板凳
发表于 2013-12-8 00:41:51 | 只看该作者
因为default之后的语句每次都执行,而且都执行一次
循环总共执行5次,所以是5, 5
地板
 楼主| 发表于 2013-12-8 00:50:24 | 只看该作者
输入c:: v1=1,v2=1
输入h:v1=3,v2=2
输入i:v1=4,v2=3
输入n:v1=5,v2=4
输入a:v1=7,v2=6  哪一步出现问题了?
5#
发表于 2013-12-8 00:53:03 | 只看该作者
coco 发表于 2013-12-8 00:50
输入c:: v1=1,v2=1
输入h:v1=3,v2=2
输入i:v1=4,v2=3

一个选择支成立,是之后的语句都会运行,但是只会运行一次
所以输入h后v1只会自增一次,其他同理
6#
 楼主| 发表于 2013-12-8 01:09:58 | 只看该作者
不是有break才停止的吗?输入h后v1自增一次后,接着执行default,再自增啊,为什么只会运行一次?
7#
发表于 2013-12-8 01:20:00 | 只看该作者
本帖最后由 rosynirvana 于 2013-12-8 01:23 编辑
coco 发表于 2013-12-8 01:09
不是有break才停止的吗?输入h后v1自增一次后,接着执行default,再自增啊,为什么只会运行一次?

这个……
case 'h':成立后,执行所有后面的语句
case 'h'后面没有v1自增,自增在default后面
default后面的自增又不能再倒回去执行一次
8#
 楼主| 发表于 2013-12-8 01:30:21 来自手机 | 只看该作者
好吧,你把我搞糊涂了。你说选择支之后的都执行,除非有break之类,这道题是没有break的,所以我就执行到底啊
9#
发表于 2013-12-8 01:42:07 | 只看该作者
所以循环体里总共就一句v1++,不管怎么样,一次循环中这个v1++有没有可能执行两次?
10#
 楼主| 发表于 2013-12-8 01:49:28 来自手机 | 只看该作者
前两个case后面是空的,就默认为下面defalt后面的语句v1自增啊。老师之前是这么讲的,但这么算,答案又不对了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表