[cpp] I/O操作符号返回数值问题

原文地址:http://www.cnblogs.com/alex-tech/archive/2012/03/27/2420197.html

I/O操作符号(<<和>>)返回数值



最近博问里有几个问题都牵涉到这一点了,简单做笔记说明一下。

首先cin是一个对象,不会"返回"值,>>和<<才是方法,具有返回值。>>和<<操作符的运算顺序是由左向右边,所以下面的两种语句描述其实是一致的:

cin>>a>>b>>c;
(((cin>>a)>>b)>>c);

操作cin>>a的意义: 调用istream 的operator>>方法读取数据并存入变量a中。那么>>或者<<的返回值是什么呢?这里说的返回值并不是指读入变量中的值,而是返回赋给左值的数据,在这里, >>返回的是cin,追踪源码可以发现这一点:

istream& operator>> (istream& is, char& ch );
istream& operator>> (istream& is, signed char& ch );
istream& operator>> (istream& is, unsigned char& ch );
istream& operator>> (istream& is, char* str );
istream& operator>> (istream& is, signed char* str );
istream& operator>> (istream& is, unsigned char* str )

当然也可以测试如下:

if ((cin >> a) == cin) {
cout << "Equal" << endl; // Yes
} else { 
cout << "Not Equal" << endl; 
}

 

为什么可以使用cin作为真值判定条件



cin可以被如下使用:

if(cin){}
if(cin>>a>>b){}
while(cin>>a){}

上面说到了>>的返回值是cin,所里上面的真值判定等同于:

if(cin){}
if(cin){}
while(cin){}

如果cin的状态ok则为真,如果cin遇到eof或者发生错误则返回false, 为什么可以使用cin作为真值判定条件?

首先看cin是如何定义的:

extern istream cin;

这样的一个值怎么可以作为if的真值判定条件呢?这是因为在if(cin)或者while(cin)的时候,其实是调用了一个istream的方法,写一行简单的代码反汇编看一下:

int main() { 
    if(cin){} 
    return 0; 
}

对应的汇编代码如下:

其实所有派生自ios的类都可以被强制转换为一个指针,如果设置了错误标志位则指针为null,否则非null,测试如下代码:
#include <iostream>
#include <fstream>
using namespace std;
 
int main () {
  ifstream is;
  is.open ("test.txt");
  if ( (void*)is == 0)// Equal to if(is)
    cerr << "Error opening 'test.txt'\n";
  return 0;
}

 

时间: 2024-12-21 07:10:19

[cpp] I/O操作符号返回数值问题的相关文章

php常用的运算符 及操作符号详解

<?php教程 /*运算符号(PHP)操作符号  *  * 按运算符号功能分为:  * 一.算术运算符   + - * / % ++ --  * 二.字符串运算符 . 连接运算符  * 三.赋值运算符   = += -= *= /= %= .=  * 四.比较运算符   > <  >= <= == === != <> !==  *  比较运算符---条件运算符---关系运算符  *  比较后的结果只有一种:boolean true false  *  === 比较

请教:java 线程中队数据库进行操作,程序返回值显示成功,单实际未成功

问题描述 问题描述:近些天公司要让我完成一个导数的模块.我写了一个导数的类AssetImpThread 实现了 Runnable接口.类有一个 初始化方法 init() 调用了 一个利用 jndi连接对数据进行操作的类.我已经 对 进行数据库操作的类进行了测试(main方法中 建立一个jndi的连接),数据库操作类正常运行.然后我对线程进行测试,奇怪的事情发生了,测试类的main() 方法中建立数据库连接, 启动线程,调用线程的init()方法,对数据进行操作.利用 PreparedStatem

c# 怎么延时等待 一个耗时操作的返回

问题描述 点击按钮时调用一个耗时函数,会导致界面假死因为这个耗时函数是需要返回参数的,如果调用新进程去执行,怎么接收它的返回.这种情况要怎么处理,谢谢 解决方案 解决方案二:把接收到的返回值先放到一个全局变量里,然后在给线程结束注册个回调事件,线程结束了,主线程就调用这个事件,然后到全局变量里拿数据解决方案三:耗时函数应该另开个线程执行,可以写个委托来处理返回结果,用信号量或者静态变量也行.解决方案四:引用2楼china_ggd的回复: 耗时函数应该另开个线程执行,可以写个委托来处理返回结果,用

MongoDB查询操作限制返回字段的方法_MongoDB

映射(projection )声明用来限制所有查询匹配文档的返回字段.projection以文档的形式列举结果集中要包含或者排除的字段.可以指定要包含的字段(例如:{field:1})或者指定要排除的字段(例如:{field:0}).默认_id是包含在结果集合中的,要从结果集中排除_id字段,需要在projection中指定排除_id字段({_id:0}).除了_id字段,不能在一个projection中联合使用包含和排除语意. 返回匹配文档的所有字段: 如果没有指定projection,fin

ASP.NET中对SQLITE数据库进行插入操作后返回自增的ID

 啥也不说了,刚刚研究出来滴~~~贴码:         /// <summary>插入        /// 返回刚刚插入的ID        /// </summary>        /// <param name="groupname"></param>        /// <param name="gid"></param>        /// <returns><

c# 操作数据库返回DataSet 超时问题怎么办?

问题描述 在本站中前面曾经提到类似的问题,但是跟帖及描述的与实际碰到情况有些不同.我在调试程序时发现,当查询返回的行数及列数很多时,查询结果返回到DataSet是系统报告超时错误.但是我在SQLServer2005下面调试执行查询(存储过程)时查询结果能够很快地得到,希望哪位大侠给出避免报错的方法. 解决方案 解决方案二:设置连接的超时时间~~~优化下查询语句,表索引解决方案三:设置dbcommand的timeout,当然解决问题的根源还是优化sql语句解决方案四:超时设置一般都是默认的,你查询

JS操作字符串转换为数值并取整的代码_javascript技巧

核心代码: 复制代码 代码如下: var result = '3.1415926' | 0; // 3 测试代码: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

我知道这是一个查询数据库返回数值的代码,但中间的红色代码什么意思?还可以怎么用?顺便拓展一下。谢啦!!!

问题描述 publicDataSetSearchTemp(){varsqltext=string.Format(@"selecttop00[I1],--产品I0[I2],0[I3],0[I4],0[I5],0[I6],''[V1]--批号,''[V2]--单位,''[V3],''[V4],''[V5],''[V6],0.00[D1],--数量0.00[D2],0.00[D3],0.00[D4],0.00[D5],0.00[D6],getdate()[DT1],getdate()[DT2],get

动态SQL中返回数值的实现代码_MsSql

复制代码 代码如下: ALTER proc [dbo].[sp_common_paypal_AddInfo] ( @paypalsql varchar(max),--不包含用户表的paypalsql语句 @paypalusersql varchar(max),--paypal用户表的sql语句 @ebaysql varchar(max),--不包含用户表的ebaysql语句 @ebayusersql varchar(max),--ebay的用户表sql语句 @paypaluserwhere va