- 突然又空,鉴于对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 对象取值过程详解的更多相关文章
-
loadrunner 参数化取值方式详解
参数化对话框中与参数取值方式有关的区域如下: 改变参数化的取值方式,关键在于Select next row和Update value on这两个选项. Select next row包括以下选项: S ...
-
mysql数据库TINYINT取值范围详解
分享下mysql中TINYINT的取值范围,很基础的一些内容. 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官方<MySQL ...
-
JS子父窗口互相取值赋值详解介绍
子窗口赋值到父窗口 代码如下 复制代码 <script>function openWin(str) { window.open(siteurl+"popup/"+ ...
-
RPC框架调用过程详解
RPC框架调用过程详解 2017年09月16日 21:14:08 荷叶清泉 阅读数 6275 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
-
Spring源码分析之Bean的创建过程详解
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...
-
C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...
-
Hadoop MapReduce执行过程详解(带hadoop例子)
https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...
-
Hadoop Mapreduce分区、分组、二次排序过程详解[转]
原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2) ...
-
转载:C/C++源代码到可执行程序的过程详解
C/C++源代码到可执行程序的过程详解 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格 ...
随机推荐
-
eclipse color theme 选择一款适合你的代码样式
1 点击eclipse菜单栏上的Help ->Install New Softwave , 点击add按钮 随便写个名字 ,添加 地址 http://eclipse-color-theme ...
-
自绘制HT For Web ComboBox下拉框组件
传统的HTML5的下拉框select只能实现简单的文字下拉列表,而HTforWeb通用组件中ComboBox不仅能够实现传统HTML5下拉框效果,而且可以在文本框和下拉列表中添加自定义的小图标,让整个 ...
-
怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制
摘自:http://www.infoq.com/cn/articles/how-to-build-a-distributed-database?utm_campaign=rightbar_v2& ...
-
SQL语句修改表
-- 更改字段类型 默认值 alter table 表名 alter column 字段名 类型 ALTER TABLE 表名 add DEFAULT ('修改后的默认值') for 字段名 WITH ...
-
python判断一个数字是整数还是浮点数
在网上闲逛,发现了一个python的用法
-
Dapper快速学习
Dapper快速学习 我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dap ...
-
[ios-必看] 国人当自强:两岸三地在线编程学习网站大搜罗 [转]
http://blog.csdn.net/lyy_whg/article/details/17350923 说到国内的在线编程学习网站,很多人都是一脸茫然,即使是资深开发者也是如此.在许多人眼中,尽管 ...
-
基于Cisco packet tracer的AAA认证
---恢复内容开始--- 1.Topology Diagram拓扑图 2.配置ip地址 3.路由互通 pc1--pc2 pc1--pc3 pc2--pc3 4.指令文件 R1: R1(config)# ...
-
windows下查看特定端口被什么程序占用
我电脑上因为命令: netstat -ano 列出的太多了,所以不好看. 以下是其他方式: 查看8088端口占用情况: 开始---->运行---->cmd,或者是window+R组合键,调 ...
-
RunTime之类与对象
我们知道,Objective-C是一门动态语言,它将很多静态语言在编译时期做的事放到了运行时来处理.用C++编写的程序通过编译器直接把函数地址硬编码进入可执行文件:而Objective-C无法通过编译 ...