啊哈磊_编程从这里起步

标题: 我算的是7,6,但答案是5,5,怎么分析? [打印本页]

作者: coco    时间: 2013-12-8 00:36
标题: 我算的是7,6,但答案是5,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);
    }
作者: rosynirvana    时间: 2013-12-8 00:36
不要管你之前学的是什么,跟着我的思路来

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. }
复制代码

作者: rosynirvana    时间: 2013-12-8 00:41
因为default之后的语句每次都执行,而且都执行一次
循环总共执行5次,所以是5, 5
作者: coco    时间: 2013-12-8 00:50
输入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  哪一步出现问题了?
作者: rosynirvana    时间: 2013-12-8 00:53
coco 发表于 2013-12-8 00:50
输入c:: v1=1,v2=1
输入h:v1=3,v2=2
输入i:v1=4,v2=3

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

这个……
case 'h':成立后,执行所有后面的语句
case 'h'后面没有v1自增,自增在default后面
default后面的自增又不能再倒回去执行一次
作者: coco    时间: 2013-12-8 01:30
好吧,你把我搞糊涂了。你说选择支之后的都执行,除非有break之类,这道题是没有break的,所以我就执行到底啊

作者: rosynirvana    时间: 2013-12-8 01:42
所以循环体里总共就一句v1++,不管怎么样,一次循环中这个v1++有没有可能执行两次?
作者: coco    时间: 2013-12-8 01:49
前两个case后面是空的,就默认为下面defalt后面的语句v1自增啊。老师之前是这么讲的,但这么算,答案又不对了




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2