• 突然又空,鉴于对cin对象的去值机制还不是很了解,就探究一番,并且记下来,方便以后复习。

     #include <iostream>
    
      int main(void)
    {
    using namespace std;
    int date = ;
    char ch;
    while (!(cin >> date)){
    cout << "Not a number.\n";
    cout << date << endl;
    cin.clear();//若没有这句,这个函数会一直输出“Not a number”,
    //原因是读取失败后,cin对象会设置失效位(failbit),导致接下来的输入被阻断
    cin >> ch;
    cout << ch << endl;
    }
    cout << date << endl;
    return ;
    }
    /**************************
    * q
    * Not a number.
    * 0
    * q
    * 4
    * 4
    * ************************/
    ~

    解释:
        第 8 行:date是int型,但我故意输入一个字符q,所以cin>>ch返回false,while括号内为true,执行while循环.

    第10行:   从代码中,可以知道date已经被初始化为2,但输出结果中,我们看到的date却变成0了,说明cin对象在取值时,会先将date变量中的值"2"踢走,   然后再将在cin>>date中输入的值放进date里,但在第八行我故意输入一个q,和date本身的类型不一样,所以无法将q放进date里.最后date只能是0了.(对于没有值的变量,默认是0)

        第11行:在对date设值失败后,q留在了输入流中,并且“锁定了输入流”(错误标志被设置),也就是说后面的语句再也不能从输入流取值了。用clear()是“解锁”。

    第13行:解锁之后,就可以将留在输入流中的q取走了,所以在14行输出的ch值就是q。

        while:执行完14行后,又退回while括号内的判断。此时cin对象会要求你从键盘输入,这次输入4,所以while循环不执行,在第16行输出date的值4后,结束程序。

  • 这一段是书本关于类型不匹配的描述:
    初始条件(int n ;   cin >> n)
    如果输入的是单词而不是数字会怎样呢?
    1,n值保持不变;------>这里好像和我上面的结论相冲.
    2,不匹配的输入将被留在输入队列里;
    3,cin对象的一个错误标志被设置;  ——————意味着不能再输入数字,要用clear()重置。
    4,对cin方法的调用将返回false(bool型)。————指的是在while或if中。
    看第一点,很明显与我上面说的"将date变量中的值"2"踢走"矛盾:
     #include <iostream>
    
      int main(void)
    {
    using namespace std;
    int n = ;
    cin >> n; cin.clear();
    char ch;
    cin >> ch;
    cout << "ch: " << ch << endl; cout << "n: " << n << endl;
    return ; }
    /***************************
    * e
    * ch: e
    * n: 0
    * ************************/

    结论:像上面程序输出所见,n的值在输入类型不匹配时,会被重值为0。大大的疑问,难道是我对这句话“n值保持不变”理解错了?这句话要在某些前提下才成立????先撇下,以后懂了来补洞。不用等了,现在就知道原因了:这个n值保持不变是指不匹配的类型没有被放进n里,仅此而已。但系统可以重置n值,所以我们见到了初始化为5的n变成了0.
    看看其他的情况:

      #include <iostream>
    
      const int Max = ;
    
      int main(void)
    {
    using namespace std;
    int test[Max]; int i;
    for (i = ; i < Max ; ++i){
    cout << "number#" << i << ": ";
    while (!(cin >> test[i])){
    cin.clear(); //reset input
    while (cin.get() != '\n')
    continue;
    cout << "Please enter a number:";
    }
    } cout << "You enter: ";
    for (int i = ; i < Max ; ++i){
    cout << test[i] << " ";
    }
    cout << endl; return ;
    } /**************************************
    * number#0: 11
    * number#1: 12
    * number#2: 13
    * number#4: qwefgf
    * Please enter a number:16
    * You enter: 11 12 13 15 16
    * ************************************/

    其他的情况在代码里,要好好看看。

cin 对象取值过程详解的更多相关文章

  1. loadrunner 参数化取值方式详解

    参数化对话框中与参数取值方式有关的区域如下: 改变参数化的取值方式,关键在于Select next row和Update value on这两个选项. Select next row包括以下选项: S ...

  2. mysql数据库TINYINT取值范围详解

    分享下mysql中TINYINT的取值范围,很基础的一些内容. 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官方<MySQL ...

  3. JS子父窗口互相取值赋值详解介绍

    子窗口赋值到父窗口 代码如下 复制代码 <script>function openWin(str) {    window.open(siteurl+"popup/"+ ...

  4. RPC框架调用过程详解

    RPC框架调用过程详解 2017年09月16日 21:14:08 荷叶清泉 阅读数 6275   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  5. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

  6. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  7. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  8. Hadoop Mapreduce分区、分组、二次排序过程详解[转]

    原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2) ...

  9. 转载:C/C++源代码到可执行程序的过程详解

    C/C++源代码到可执行程序的过程详解 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格 ...

随机推荐

  1. 请不要把‘通知的观察者注册’放在-viewWillAppear:中

    接手项目二次开发的吐槽: 接手别人的代码的悲哀之一就是,我反复的把流程走了一遍又一遍,却始终无法发现原来是这个问题. 之前这个人把通知的观察者注册放在了-viewWillAppear:中,导致,我发送 ...

  2. UWP: 掌握编译型绑定 x:Bind

    在 UWP 开发中,我们在进行数据绑定时,除了可以使用传统的绑定 Binding,也可以使用全新的 x:Bind,由于后者是在程序编译时进行初始化操作(不同于 Binding,它是在运行时创建.初始化 ...

  3. Hibernate(四)之对象状态及一级缓存

    一.Hibernate中的对象状态 1.1.瞬时态(临时态) 没有与Hibernate产生关联 与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应) 获得:一般都只直接创建(new) 瞬 ...

  4. Hadoop之RPC简单使用(远程过程调用协议)

    一.RPC概述 RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法me ...

  5. (转)Python 遍历List三种方式

    转自: http://www.cnblogs.com/pizitai/archive/2017/02/14/6398276.html # 方法1 print '遍历列表方法1:' for i in l ...

  6. 利用jackson-databind,复杂对象对象和json数据互转

    如果简单对象,那么转换的方式比较多,这里指的复杂对象,是指对象里面存在cycle引用,比如: /** * @author ding * */@Entity@Table(name = "ser ...

  7. java swing组件的一些基本属性

    JLabel get/setText(): 获取/设置标签的文本. get/seticon(): 获取/设置标签的图片. get/setHorizontalAlignment(): 获取/设置文本的水 ...

  8. Java设计模式:代理模式(一)

    问题的提出 现在生活中,常常在微信朋友圈里面看到代购的信息,你想在国外买什么,香港买什么,但是又懒得自己过去,于是常常委托别人帮忙买奶粉买那啥的.这类问题的缘由是因为客户和原产地没有直接的接触,所以需 ...

  9. React的学习(上)

    摘要 众所周知,前端三大框架Angular.React.Vue,所以为了跟上时代的步伐,最近开始着手学习React,这时候就发现个大问题,框架一直在更新,提倡的编写语法也在更新,网上有许多教程都是一两 ...

  10. python代码零散知识点

    1.用python读入csv文件 green_taxi1=pd.DataFrame(pd.read_csv('../../../../MatlabCode/data/green/green_tripd ...