标准输入cin的返回值以及while(cin>>x)的问题

原文 :https://www.cnblogs.com/gysm/archive/2011/08/03/2126511.html

  看到cin的时候,我们经常看到很多的代码中会有这么一段while(cin>>x){ ……}。这里我们最关注的问题是while括号里面cin>>x他每次输入的时候返回的是什么值呢。所以我们也就会问cin的返回值是什么。我也看到很多像我这样的新手问这样的问题,下面说下我个人的见解,如有不当之处,还请指正!

  其实我倒觉得我们这个问题问错了,我们不应该问cin返回值是什么,我觉得我们应该关注”>>”输入操作符,其实是它到底返回了什么。因为cin是标准输入istream的一个对象,一个对象能返回什么吗?对象有返回值吗?好像没有吧!在C++primer里面讲到过,cin>>x>>y。有这么一行代码,我们讨论下”>>”这个输入操作符,这个操作符接收一个istream对象作为其做操作数,接收一个对象作为其右操作数。”>>”操作符返回其左操作数作为结果,这样也就可以解释为什么上面可以将两个输入操作合并了。因为cin>>x返回cin对象,接着又可以进行cin>>y。所以我们就可以顺利进行输入了。所以我们再来看上面的那个while循环,里面的cin>>x,返回的是cin对象(注意是输入操作符“>>”返回),所以返回的也就可以认为是流本身了。我们再来看下他什么时候退出循环。因为我们已经知道了括号里面的返回值了,所以我们看看它什么时候退出循环。

  输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin 就会检测输入缓冲区中是否有了可读的数据,这种情况下cin对键盘上是否有作为流结束标志CTRL+Z或者CTRL+D,其检查的方式有两种:阻塞式以及非阻塞式。
  
  阻塞式: 指只有在按下回车键后才对之前是否有按下Ctrl+z进行检测。

  非阻塞式: 指在按下Ctrl+d之后立即响应。
  
  在非阻塞式模式下,按下Ctrl+d后立即响应,如果在此之前有输入字符,则Ctrl+d就相当于回车,即把输入的内容送到输入缓冲区供读取使用,此时Ctrl+d不作为流结束符使用,下次按下的Ctrl+d则作为流结束标志。如果按下Ctrl+d之前没有输入任何数据,刚Ctrl+d作为流结束标志,表示标准输入设备对应的文件结束。linux下输入就是非阻塞式的。
  
  在Windows系统中输入一般采用阻塞式模式来对Ctrl+Z进行检测,在这种模式下,只有按下回车对会去检测之前有没有按下Ctrl+z,才会去检测流是否结束。那么就会有这样一个问题,就是在按下回车之前,输入缓冲区并不能检测到是否有Ctrl+z按下,所以即使按了Ctrl+z,照样还可以从键盘去输入内容,但是Ctrl+z之后输入的内容到时候并不会被读取到,因为在缓冲区检测时,如果检测到Ctrl+z(结束标志),就会认为输入流结束了,那么后边的内容就不会被读进行,而被丢掉。当你在你的程序中输入数据的时候,你要结束输入,你输完数据直接回车,再按下CTRL+Z,再按下回车就可以结束了。因为前面说过如果输入缓冲区中有可读的数据则不会检测 Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。
  
  另外还有一点需要说明,就是Ctrl+z或Ctrl+d并不会产生一个普通的ASCII码值,也就是说它不会产生一个字符,不会被放到输入缓冲区中,所以大家也是读不到它的,

  在程序中scanf("%d",%i)cin>>i 时输入Ctrl+Z,会返回0,所以可以作为循环条件。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值