getchar()是c语言中的io流的获取一个字符的函数。
getchar源码分析:
1,getchar-》getchar-》_fgetchar
2、在_fgetchar中调用了getc,getc调用了_getc_nolock(stream)。
3、_getc_nolock(stream)是个宏
#define _getc_nolock(_stream) _fgetc_nolock(_stream)
_fgetc_nolock(_stream)也是个宏,
#define _fgetc_nolock(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
由此可以看出,如果stream->_cnt是大于0的话,getchar就会读取上次读到的值,并不需要用户输入。
4、_filbuf掉用_read,_read调用_read_nolock,_read_nolock调用ReadFile进行用户输入。
以上大致是一个getchar的函数流程。
通过以上解析可以清楚的理解一下代码,
char one = getchar();
char two = getchar();
上面两行代码在one输入一个'a'和回车后,stream的ptr包含‘a’和换行符,并且->_cnt是2,在one取走'a'后,
stream的->_cnt是1,所以调用two的时候就会调用0xff & *(_stream)->_ptr++,所以不用输入,直接返回换行符。