初步分析


  在C++中实现连续输入时,我们会用到 while(cin >> x >> y) ,但是它的条件判断的原理可不那么好想,这里我分享一下我对于它的见解。

  首先来看 cin >> x >> y,它的返回值是什么?首先要明确的是 cin 是一个 istream 对象,一个对象并没有返回值这个概念,那可以产生返回值的东西就只有" >> "运算符符了。在《C++ primer(第五版)》中我们知道,"">>"运算符左边是一个 istream 对象,右边是需要被输入的对象,它返回其左侧运算对象作为计算结果。也就是说, 它每次进行一次运算后返回的都是 istream 对象,在这里就是标准输入 cin。

   ">>"运算符背后的机制是引用与运算元重载,这种选项可以更方便地返回左值(左值就是可以被取地址运算符 & 操作的变量),而 istream::opreator>>() 就需要返回左值,才能做到 (cin >> x) >> y。

  这就是为什么 std::cin >> x >> y; 可以等价于 (std::cin >> x) >> y; 和 std::cin >> x; std::cin >> y; 的原因。

  知道了返回值是什么后,问题还是没有解决,因为我们不知道如何判断一个对象的值是 TRUE 还是 FALSE ,看来得深究一下 cin 对象了。

cin 对象的深入理解


  

  通过查阅资料,我们知道 cin 是行缓冲。对于行缓冲的描述,man手册里有如下的一句话可以很好的说明什么是行缓冲:

  大概意思是:cin 是行缓冲,你从键盘上输入一串字符,这一串字符首先会被缓冲区保存下来。每当你按下回车键的时候,cin 就会检测输入缓冲区是否有可读的数据。在这里,cin 会检查键盘输入是否有流结束标志 CTRL + X (我用的是 Linux,Windows是 CTRL + Z) 和 CTRL + D(EOF)。在这里我翻阅了网上资料,发现检查的方法一共有两种,一种是阻塞式检查,一种是非阻塞式检查。

  阻塞式检查是这样:只有在你按下回车后才能检查之前是否输入了 CTRL + X。

  非阻塞式检查是这样:只要你按了 CTRL + D,就立即响应。如果你按下 CTRL + D 之前还有字符,此时 CTRL + D 相当于是回车的作用,会把你之前从键盘输入的字符输入缓冲区供读取使用。

  我们拿一个程序验证一下所讨论的两种检查方式:

//This program's name is 1.cpp
#include<iostream>

int main(void)
{
    int i;
    cout << (cin >> i) << endl;
    ;
}  

  Input:

    1、从键盘输入:“12345" + CTRL + D;

    2、从键盘输入:CTRL + D;

    3、从键盘输入:"12345" + CTRL + X;

    4、从键盘输入:CTRL + X。

  Output:

  

  结果:

    1、立马响应,同时将12345读入输入缓冲区并输出括号里的值;

    2、立马响应,输出括号里值,此时 cin 对象值为0

    3、先不响应,再输入回车后立马响应,同时读入”12345“

    4、先不响应,再输入回车后立马响应,此时 cin 对象值为0

  

总结


  

  标题中的两个条件判断都可以这么想:由于 cin 是行缓冲且存在两种阻塞检查机制,当你按下 CTRL + D 或者 按下 CTRL + X + 回车,cin 接收到流结束标志,使得  cin 的值为0,导致条件判断为 FALSE。这是我个人的分析,可能有部分知识不严谨,欢迎指正。

深入理解 while(cin >> x >> y)的更多相关文章

  1. <python 深入理解>变量交换x,y=y,x实现机制--元组

    python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) ...

  2. C++IO关于cin>>和getline的理解

    这个问题困扰了我有一段时间了,趁着十一放假有时间,仔细研究了一下 首先来看一下输入输出运算符cin>>的构成:cin和>> cin>>是由两部分构成的,cin和&g ...

  3. Deep learning:五十(Deconvolution Network简单理解)

    深度网络结构是由多个单层网络叠加而成的,而常见的单层网络按照编码解码情况可以分为下面3类: 既有encoder部分也有decoder部分:比如常见的RBM系列(由RBM可构成的DBM, DBN等),a ...

  4. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  5. 对于BFS的理解和部分例题(

    (图文无关    雾 搜索是一个NOIP当中经常出现的考点,其实搜索换个方式来想也无非就是让电脑来帮你试,最后得到一个结果,当然这么口胡谁都会,那么我们就来看看搜索当中的一个大部分: BFS(广度优先 ...

  6. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  7. 关于scanf与cin哪个快的问题

    一开始入c++的时候成天跑cin,cout 直到有一天用cin,cout超时 才知道scanf比cin快的多 但是后来又听说加了ios::sync_with_stdio(false);的cin跟飞一样 ...

  8. dijkstra算法理解+模板

    2017-09-17 21:10:45 writer:pprp 看了看dijkstra算法,用自己语言总结一下主要过程吧, 首先,明确这个算法用处是在于计算单源最短路径问题并且边权非负,给出一个起点可 ...

  9. hdu 1556 涂气球 线段树(区间更新~对区间[x,y]更新,求任意节点被更新的次数)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. bootstrap --> reset css

    /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, ...

  2. Python StringIO与BytesIO、类文件对象

    StringIO与BytesIO StringIO与BytesIO.类文件对象的用途,应用场景,优.缺点. StringIO StringIO 是io 模块中的类,在内存中开辟的一个文本模式的buff ...

  3. 如何用while循环输出十行十列变色★☆

    输出十行十列星星 k = 0 #设置一个终止变量 while k < 10: i = 0 #设置一个满十换行变量 while i < 10: print('★',end='') i += ...

  4. unity3d资源打包总结

    http://www.manew.com/blog-33734-12973.html unity 打包的时候会把下面几个文件资源打进apk或者ipa包里面 1. Asset下的所有脚本文件 2. As ...

  5. jq获取被选中的option的值。jq获取被选中的单选按钮radio的值。

    温故而知新,一起复习下jq的知识点. (1) jq获取被选中的option的值 <select id="select_id"> <option value=&qu ...

  6. async await Task

    一.使用Task 引用命名空间 using System.Threading.Tasks; 1.工厂方式 Task.Factory.StartNew(() => {Console.WriteLi ...

  7. memcache的使用、版本使用和相关配置

    首先准备memcached和php_memcache.dll文件.下载网址:链接:http://pan.baidu.com/s/1c1WODji 密码:yzor 将下载好的memcached.exe放 ...

  8. AFNetworking提示3840 Unescaped control character around character XXX

    处理办法:找到AFNetworking包中AFURLResponseSerialization.m文件在第250行修改代码如下: if (data.length > 0 && ! ...

  9. 企业实战Nginx+Tomcat动静分离架构的技术分享

    Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat.Re ...

  10. 实践作业2:黑盒测试实践——编写自动化脚本并拍摄测试过程视频 Day 6

    下午下课之后小组成员一起交流了一下实验过程遇到的一些问题,并汇总了下各个项目完成情况 该实验目前(写博客是时间)基本完成,具体情况如下 (1)分析系统需求 .(done) (2)设计测试用例.(don ...