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

 更新时间:2022年07月25日 11:28:19   作者:code的魅力  
这篇文章主要介绍了C++中cin>>n的返回值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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这样连用的场景;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ahJpo6qF-1655438506866)(../img/image-20220617114231728.png)]

那么既然返回值是一个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作为条件判断;

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

相关文章

  • C语言一维数组初步学习笔记

    C语言一维数组初步学习笔记

    这篇文章主要介绍了C语言一维数组初步学习笔记,包括指针访问数组等重要知识点,需要的朋友可以参考下
    2016-05-05
  • 使用MySQL编程实现C语言功能强大化步骤示例

    使用MySQL编程实现C语言功能强大化步骤示例

    这篇文章主要为大家介绍了使用MySQL编程实现C语言功能强大化步骤示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • c++多线程为何要使用条件变量详解

    c++多线程为何要使用条件变量详解

    多线程是多任务处理的一种特殊形式,下面这篇文章主要给大家介绍了关于c++多线程为何要使用条件变量的相关资料,需要的朋友可以参考下
    2021-06-06
  • C语言基础 strlen 函数

    C语言基础 strlen 函数

    这篇文章主要介绍了C语言基础 strlen 函数,在C 语言中,char 字符串也是一种非常重要的数据类型,我们可以使用 strlen 函数获取字符串长度,这就是C语言strlen 函数的作用,下面我们来简单介绍该内容,需要的朋友可以参考以下
    2021-10-10
  • 解析C++中的for循环以及基于范围的for语句使用

    解析C++中的for循环以及基于范围的for语句使用

    这篇文章主要介绍了解析C++中的for循环以及基于范围的for语句使用,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 详解c++中signal信号携带数据的接收与发送

    详解c++中signal信号携带数据的接收与发送

    这篇文章主要为大家详细介绍了c++中signal信号携带数据的接收与发送的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C语言拓展实现Lua sleep函数

    C语言拓展实现Lua sleep函数

    这篇文章主要介绍了C语言拓展实现Lua sleep函数,本文使用C语言写出sleep函数,编译后在Lua中调用,需要的朋友可以参考下
    2015-04-04
  • C++中构造函数的参数缺省的详解

    C++中构造函数的参数缺省的详解

    这篇文章主要介绍了C++中构造函数的参数缺省的详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • C++判断矩形相交的方法

    C++判断矩形相交的方法

    这篇文章主要介绍了C++判断矩形相交的方法,涉及C++针对平面坐标数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C/C++中如何判断某一文件或目录是否存在

    C/C++中如何判断某一文件或目录是否存在

    以下文章是对C/C++中判断某一文件或目录是否存在的实现代码进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07

最新评论