kbhit:非阻断函数,运行时不会暂停程序,作用是若有键盘输入,则返回输入的值(应该是键值转换),若没有则返回0。
getch:阻断函数。等待键盘输入,并在输入后立即返回第一个字符,无需按下回车
将以下代码嵌套至while(1)内循环:
void move() { char a; bool b; b=kbhit(); if(b) { a=getch(); cout<<"yes__________________________________________________________________________________-"; } else { cout<<"no "<<a; } }
能够实现持续获得键盘输入,即类似于贪吃蛇等游戏的实时反馈功能。
但是如果将代码中的a=getch()删除,或给a赋值任意常量。
则该功能失效。
测试过程中发现:
kbhit()与getch()组合时,kbhit()的值初始为false,按键后为true,在经过getch()后再次变为false。
删除getch()之后,kbhit()的值初始为false,按键后为true,此后一直为true,不再改变。
根据测试过程猜测:
1.kbhit()会根据某一标准判断是否按键,并根据该标准改变值
2.由于getch()具有读取键盘缓存区数据的功能,因此推测kbhit()的改变是由于getch()对于缓存区数据读取造成,即:
kbhit对于是否按键的标准为==>键盘缓存区是否有数据存储
这样一来就可以解释为何kbhit()与getch()组合是产生的功能:键盘按键后,键盘缓存区存入数据,kbhit()随之改变值。之后进程调用getch(),getch()读取缓存区内数据,缓存区清零。再次调用kbhit()时,
此时由于缓存区数据已被getch()读取清零,所以kbhit()再次改变值。
以上仅为个人猜测。
原文:https://www.cnblogs.com/kohano/p/14819593.html