scanf和cin的返回值问题

18 篇文章 0 订阅

本文目录

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作为条件判断

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏天乐大帅哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值