初探 if(!cin)

         使用 if(!cin) 对输入的参数进行相应数据类型的判断,对于初学者来说具有很大的引用力。但是,在使用 if(!cin) 做出判断时,可能会遇到一些奇特的问题,这里以笔记的形式对其中的几类简单情况做出总结。

   首先,列写出正确地应用方式:



  该程序十分简单,用来判断输入的值是否为 int 类型。下面是一些测试数据的返回结果,其能够说明一些问题:


  1.输入的值为12,其为理想输入,打印 “GOOD”;

  2.输入的值为12.3,不满足 int 类型。但为什么能够首先打印出 “GOOD” 呢?这是因为操作符 “>>” 逐个抽 取输入流中的数据,不断与 int 类型匹配,哪怕只是部分匹配,cin 对象的标记位都不会被改变,可以正常的输入。对于此例,也就是 “12.3” 中的 “12” 可以先被抽出进入循环,打印出 “GOOD”。一旦输入完全不匹配,操作符 “>>” 无法进行任何抽取,返回的cin 对象的fail 标记位置1,good 标记位置0。这种状态在 cin.clear( ) 生效之前(标记位重置),会使输入流不能再进行继续的输入。而这种性质也就导致了本例中对于 “12.3” 的输入,在打印完 “GOOD” 之后并没有经历再次输入的过程就马上打印 “BAD”。而触发这种状况的是字符 ‘.’ 进入判断条件,而无论后面接 ‘3’ 还是 ‘a’ 都对结果没有任何影响。因为它们已经被接下来的代码段给清空了,而这也就是下面要说明的问题。

  3.有没有接下来的代码段影响很大


  我们先看看注释掉它的效果:



   一旦输入不符合要求的值,它将无限打印 “BAD”。那么问题出现在哪呢?以输入“12.2”为例,如果没有上述代码清空输入缓存中的 “坏数据”,那么对于字符 “.” ,就处在了一个十分尴尬的位置。虽然在它引发了第一次错误后重置了标记位,但这并不会使它具有通过语句 “cin >> temp” 而进入一个int 类型的变量当中的特权。当然,这也是 cin 所必须具备的特质,否则其便没法称职的保护输入流。所以,这种局面就会被描绘成这样:字符 “.” 永远出现在输入缓存区的最前端被不断地拿来调用,使程序不断地打印 “BAD”,但其本身却永远无法跨过cin 这座关卡。

  • 12
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值