C++中cin>>n的返回值

目录
  • cin>>n的返回值
    • cin>>n作为判断条件返回的是什么值呢?
  • scanf和cin的返回值问题
    • scanf
    • cin
    • 小结一下

cin>>n的返回值

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main()
{
	int n,temp;
	vector<int> arr;
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
		{
			cin>>temp;
			arr.push_back(temp);
		}

		sort(arr.begin(),arr.end());

		for(int i=0;i<n;i++)
			cout<<arr[i]<<" ";
		cout<<endl;

		system("pause");
		return 0;

	}
}

cin>>n作为判断条件返回的是什么值呢?

如果要输出正确结果,这个判断条件必须在客户想要结束程序的时候结束输入,要怎么做呢?如果输入一个错误的类型,cin会失效,循环也会停止,但是这样做毕竟是个错误,那么究竟要怎样做才能正常结束这个循环呢?

【注意】

cin>>n返回的也是一个cin对象,当一个cin对象作为条件选择、循环等的控制表达式时,编译器会将其转换为真值表达式,如果cin的iostate为goodbit,则这个真值表达式的结果为真,否则为假。

输入一个非数字可以置位failbit,从而结束循环,当然这是一个非正常退出。

正常退出可以用键盘模拟产生EOF,表示流输入结束了。在windows中可以输入ctrl+z,unix/linux中则为ctrl+d。

scanf和cin的返回值问题

scanf

scanf是一个函数,它的返回值是一个int,该int代表scanf成功读取到数据的个数,如果读到文件末尾或者输入ctrl+z标志读取完毕的时候就会读到EOF,这是它会返回0,相当于false;

int n;
    while (scanf("%d", &n) != EOF)
    {
        getchar();//吃掉回车
        cout<<n<<endl;
    }

cin

首先 cin是一个ios(iostream)中的对象,那么他不是函数,不存在什么返回值;

int n;
	while (cin>>n)
	{
		cout << "flag" << endl;
	}

这段程序看起来好像cin返回了值作为while中的条件判断,实际上cin是一个对象,无返回值,而这个返回值是std中重载>>这个运算符返回的,其类型是一个istream&,这也说明了可以cin>>a>>b这样连用的场景;

那么既然返回值是一个istream&类型,那么这个类型的对象怎么作为条件逻辑判断的呢?

istream作为ios继承的一个类型,其中重载了bool这个操作符别名,使得istream其对象可以调用bool操作符(相当于加了一个本类型与bool类型的转换函数),该函数选择性的返回给条件判断语句true或者false,比如istream的对象 如果收到EOF(ctrl+z)就会return false,这也说明了while(cin>>n)当传入EOF能停下来的原因;

则下面两段代码等价:

int n;
	while (cin>>n)
	{
		cout << "flag" << endl;
	}

int n;
	while ((cin>>n).bool())
	{
		cout << "flag" << endl;
	}

如果某个类型没有重载bool操作符,那么它就不能用于条件逻辑判断;

class A
{
public:
	int a = 0;
};
int main() {
	A a;
	if (a) cout << 1 << endl;
	else cout << 0 << endl;
	return 0;
}

添加重载bool操作符;

class A
{
public:
	int a = 0;
	operator bool()//注意 转换函数比较特殊 无返回值
	{
		if(a==0) return false;
		return true;
	}
};
int main() {
	A a;
	if (a) cout << 1 << endl;
	else cout << 0 << endl;
	return 0;
}

要注意的是 这里operator bool()相当于是一个原生类型与bool类型的转换函数,会返回一个bool值给逻辑表达式作为判断,但是重载operator bool()的时候无返回值!这是其特殊的地方!

因此,若想使用自定义类型作为逻辑判断表达式的判断依据,只要在这个类型中设置转换函数即重载operator bool()即可;

小结一下

1**.scanf是一个函数**,返回值为一个int,代表scanf读入对象的个数,如果其读到EOF结束标志,会返回0相当于false;

2.cin是一个istream类型对象,他能作为判断语句的原因是istream类型中的>>操作符会返回一个istream对象(cin),如果>>读到EOF那么返回的istream对象(cin)中会检测到EOF的存在,那么istream类型的operator bool()转换函数起作用将这个对象(cin)转换成bool类型false作为条件判断;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 基于C++ cin、cin.get()、cin.getline()、getline()、gets()函数的使用详解

    1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 附:cin.ignore();  cin.get()//跳过一个字符,例如不想要的回车,空格等字符 1.cin>>          用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream> using namespace std; main () {    int a,b;    cin>>a>&g

  • C++中cin的用法详细

    代码编译运行环境:VS2012+Win32+Debug. 1.cin简介 cin是C++编程语言中的标准输入流对象,即istream类的对象.cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘.此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象.这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕. 在理解cin功能时,不得不提标准输入缓冲区.当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓

  • C++ cin输入的多种方法详解

    目录 前言 一.cin 1.cin >> 2.cin.get() 2.1 函数介绍 3.getline() 前言 在C++中一般使用cin来进行交互,获取用户输入信息.cin是C++编程语言中的标准输入流对象,即stream类的对象.cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘.主要用到有cin >>.cin.get().cin.getline().cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就

  • C++中cin>>n的返回值

    目录 cin>>n的返回值 cin>>n作为判断条件返回的是什么值呢? scanf和cin的返回值问题 scanf cin 小结一下 cin>>n的返回值 #include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { int n,temp; vector<int> arr; while(cin>>

  • 解决nodejs中使用http请求返回值为html时乱码的问题

    今天用nodejs进行http请求时返回的数据是一个html文件,然后我还是按照以前解析json数据的方法.果不其然报错了:SyntaxError: Unexpected token  in JSON at position 0 没办法,只好换一种方法,将接受到的Buffer对象toString,然后打印出来发现是乱码. 第一感觉是编码问题,google一下然后看官方文档,总结三种方法: 1.toString 加编码格式作为参数. 2.使用iconv-lite 改变编码. 3.使用cheerio

  • 老生常谈javascript中逻辑运算符&&和||的返回值问题

    今天在做逻辑运算符的时候遇到一个小问题一直转不过弯来,var a=(undefined&&123)||(3||5)的返回值是什么? 首先是||的返回值问题: ||的返回值会返回最早遇到非以下类型的值: NaN null undefined 0 false; 所以3||5返回的是3: 如果||左右两边都是以上类型的值时,会返回最后一个 如 var a=0||null||undefined则a返回的值是undefined; 其次是&&的返回值问题: &&的返回值

  • 关于JS中match() 和 exec() 返回值和属性的测试

    语法: exec() : RegExpObject.exec(string) match() : stringObject.match(string) stringObject.match(regexp) 知识点: exec() 是RegExp对象的方法,而 match() 是String对象的方法. 都会返回包含第一个匹配项信息的数组:或者在没有匹配项的情况下返回null. 返回的数组虽然是Array 的实例,但包含两个额外的属性:index 和 input.其中,index 表示匹配项在字符

  • 浅谈Java中的this作为返回值时返回的是什么

    有时会遇到this作为返回值的情况,那么此时返回的到底是什么呢? 返回的是调用this所处方法的那个对象的引用,读起来有点绕口哈,有没有想起小学语文分析句子成份的试题,哈哈. 一点点分析的话,主干是"返回的是引用": 什么引用呢?"那个对象的引用": 哪个对象呢?"调用方法的那个对象": 调用的哪个方法呢?"调用的是this所位于的方法":这样就清楚了. 再总结一下就是,this作为返回值时,返回的是调用某方法的对象的引用,这

  • Python 中的参数传递、返回值、浅拷贝、深拷贝

    1. Python 的参数传递 Python的参数传递,无法控制引用传递还是值传递.对于不可变对象(数字.字符.元组等)的参数,更类似值传递:对于可变对象(列表.字典等),更类似引用传递. def fun1(n): print(n) # n在没修改前,指向的地址和main函数中n指向的地址相同 n = 20 # n在修改后,指向的地址发生改变,相当于新建了一个值为20的参数n def fun2(l): print(l) # l在没修改前,指向的地址和main函数中l指向的地址相同 l = [5,

  • ASP.NET Core中的Action的返回值类型实现

    在Asp.net Core之前所有的Action返回值都是ActionResult,Json(),File()等方法返回的都是ActionResult的子类.并且Core把MVC跟WebApi合并之后Action的返回值体系也有了很大的变化. ActionResult类 ActionResult类是最常用的返回值类型.基本沿用了之前Asp.net MVC的那套东西,使用它大部分情况都没问题.比如用它来返回视图,返回json,返回文件等等.如果是异步则使用Task. public class Te

  • Django中get()和filter()返回值区别详解

    先上官方文档! filter(**kwargs) 返回包含与给定查找参数匹配的对象的新查询集. 简单来说,返回一个又对象组成的查询集合 get(**kwargs) 返回与给定查找参数匹配的对象,该对象应采用字段查找中描述的格式. 例子 例如在Model中有一个Order类,包含一个id字段,输入 id 为2019 字段的 id 1.get()方法 orders = Orders.objects.get(id=20190003) print(order) 先查看orders是什么,结果为 Orde

  • Chrome中模态对话框showModalDialog返回值问题的解决方法

    没有找到太好的解决办法,暂时处理方法是,在弹出窗口中同时给 window.opener.ReturnValue 赋返回值.这样在关闭窗口后,通过下面的代码取得返回值: 复制代码 代码如下: var val = window.showModalDialog(...); if(!val) val= window.ReturnValue; 这样在IE.FF.及Chrome中,都可以得到返回值了.

  • VBS中InputBox函数的返回值使用技巧

    如果用户单击确定或按下 ENTER,则 InputBox 函数返回文本框中的内容.如果用户单击取消,则函数返回一个零长度字符串 (""). 这是参考手册对InputBox函数返回值的说明,简单而明了,还有必要专门写一篇文章来讨论?我知道你一定对标题不屑一顾,换成是我,我也一定会不屑一顾,如果我没有看到百度VBS吧里的一个帖子. 关于Inputbox 疑惑 ---------------------------- 如果用户单击确定或按下 ENTER,则 InputBox 函数返回文本框中

随机推荐