鱼C论坛

 找回密码
 立即注册
查看: 3160|回复: 16

c语言初级问题,求助,我真的想不出了

[复制链接]
发表于 2014-9-4 20:04:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<conio.h>
void main()
{
int a=0,i,sum=0,b;
for (i=1;i<=1000000;i++)
{
        sum=sum+i;
        if(kbhit())          //请看这里
{
      if(' '==getch())
     {
       i=1000001;
      }
}                     //到这里为止,这段语句
else
{
   printf("%d",i);
}

}
printf("%d",sum);
}

/*****************/
*我想问的就是 上面标识的那段语句我如果单单用
if(' '==getch())
{
  i=1000001;
}
这个程序就只能在我们按下一个按键后才执行下面的语句。(就是会有中断)

为什么上面用
if(kbhit())
{
   if(' '==getch())
   {
     i=1000001;
   }
}
这样的嵌套语句       他就不会    出现   按下按键   才 执行  下面语句  的这种情况。(说白了就是没有中断)
这样的嵌套语句就没有中断出现,这是为什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-4 20:51:58 | 显示全部楼层
别沉了
:sad:sad:sad:sad:sad:sad:sad:sad:sad:sad
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-4 21:07:11 | 显示全部楼层
可能说明kbhit()的返回值为0,所以没有进入if-else中的if,而进入了else。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-4 21:21:55 | 显示全部楼层
应该不是  ,我认为是调取中断指令被覆盖了,或者是,啊呀我头脑乱啦#@¥%@#¥%@#!@#¥@!#¥:dizzy::dizzy::dizzy::dizzy::dizzy::dizzy::dizzy::dizzy::dizzy:,可能会汇编的会解释得通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-4 21:23:17 | 显示全部楼层
@小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-4 21:23:55 | 显示全部楼层
我是来打酱油的,顺便帮楼主顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-4 21:40:47 | 显示全部楼层
救命啊,强迫症患者受不了啊~~~~~,我试了反汇编但。。。。。汇编不是很厉害,了解的信息不多啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-4 23:08:24 | 显示全部楼层
键盘缓冲区队列不为空,getch(),会检查键盘缓冲区,缓冲区为空才会停下来等待输入,否则就取走缓冲区队列的第一个元素。
你的程序我没仔细看,大概是上下文中有写缓冲区的代码,而在你的问题代码前没有将缓冲区的剩余数据拿走,所以导致没有中断。你可以试试在getch前面加一个getchar试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-4 23:43:57 | 显示全部楼层
是写得太乱了没法看吧。。。呜呜~~~~~~,我这就去看看,。。。。。。。。我试了,发现在前面加入getchar()也是一样没有中断,我估计可能kbhit()这个函数 里面有 跳过中断 代码,或者向缓冲区写入了其他东西,使其强制跳转
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 00:38:11 | 显示全部楼层
好吧一切都是我想太多了,呵呵乱了,谢谢大家了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-6 12:07:01 | 显示全部楼层
你的意思是按了后的sum直没有加上1000001还是按了不会停止??
我试了会停下来阿!!
会不会是编译器的问题?!!
大牛快来!!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-7 22:28:29 | 显示全部楼层
我是来赚鱼币的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-8 13:38:37 | 显示全部楼层
kbhit()(VC++6.0下为_kbhit())
功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
用 法:int kbhit(void);
包含头文件: include <conio.h>

getch():
所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上
函数原型:int getch(void)
返回值:读取的字符
例如:
char ch;或int ch;
getch();或ch=getch();
用getch();会等待你按下任意键,再继续执行下面的语句;
用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句

这里因为没有键按下所以kbhit返回0 直接跳出if语句执行else部分
在程序执行过程中自始至终都没有执行   
if(' '==getch())
   {
     i=1000001;
   }
而不是没有中断
要执行需要将判断条件改为 !kbhit()
建议你碰到这种问题调试一下就行了 不要动不动就怀疑编译器:titter:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-8 23:17:42 | 显示全部楼层
路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-9 17:25:07 | 显示全部楼层
  来学习额
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-10 19:51:32 | 显示全部楼层
   来学习啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-11 11:37:18 | 显示全部楼层
  来学习滴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 22:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表