l10978 发表于 2014-9-4 20:04:34

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

#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;
   }
}
这样的嵌套语句       他就不会    出现   按下按键   才 执行下面语句的这种情况。(说白了就是没有中断)
这样的嵌套语句就没有中断出现,这是为什么呢

l10978 发表于 2014-9-4 20:51:58

别沉了
:sad:sad:sad:sad:sad:sad:sad:sad:sad:sad

methamphetamine 发表于 2014-9-4 21:07:11

可能说明kbhit()的返回值为0,所以没有进入if-else中的if,而进入了else。

l10978 发表于 2014-9-4 21:21:55

应该不是,我认为是调取中断指令被覆盖了,或者是,啊呀我头脑乱啦#@¥%@#¥%@#!@#¥@!#¥:dizzy::dizzy::dizzy::dizzy::dizzy::dizzy::dizzy::dizzy::dizzy:,可能会汇编的会解释得通

l10978 发表于 2014-9-4 21:23:17

@小甲鱼

ghuibin 发表于 2014-9-4 21:23:55

{:5_107:}我是来打酱油的,顺便帮楼主顶一下

l10978 发表于 2014-9-4 21:40:47

救命啊,强迫症患者受不了啊~~~~~,我试了反汇编但。。。。。汇编不是很厉害,了解的信息不多啊

川本姨夫 发表于 2014-9-4 23:08:24

键盘缓冲区队列不为空,getch(),会检查键盘缓冲区,缓冲区为空才会停下来等待输入,否则就取走缓冲区队列的第一个元素。
你的程序我没仔细看,大概是上下文中有写缓冲区的代码,而在你的问题代码前没有将缓冲区的剩余数据拿走,所以导致没有中断。你可以试试在getch前面加一个getchar试试。

l10978 发表于 2014-9-4 23:43:57

是写得太乱了没法看吧。。。呜呜~~~~~~,我这就去看看,。。。。。。。。我试了,发现在前面加入getchar()也是一样没有中断,我估计可能kbhit()这个函数 里面有 跳过中断 代码,或者向缓冲区写入了其他东西,使其强制跳转

l10978 发表于 2014-9-5 00:38:11

好吧一切都是我想太多了,呵呵乱了,谢谢大家了

Peterlai 发表于 2014-9-6 12:07:01

你的意思是按了后的sum直没有加上1000001还是按了不会停止??
我试了会停下来阿!!
会不会是编译器的问题?!!
大牛快来!!

gyixue 发表于 2014-9-7 22:28:29

我是来赚鱼币的

优雅的独行者 发表于 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:

小疯子丶 发表于 2014-9-8 23:17:42

路过

骑猪撞宝马 发表于 2014-9-9 17:25:07

来学习额

骑猪撞宝马 发表于 2014-9-10 19:51:32

   来学习啦

骑猪撞宝马 发表于 2014-9-11 11:37:18

来学习滴
页: [1]
查看完整版本: c语言初级问题,求助,我真的想不出了