为了账号安全,请及时绑定邮箱和手机立即绑定

if(cin >> x)-为什么要使用该条件?

if(cin >> x)-为什么要使用该条件?

C++
慕标琳琳 2019-11-12 13:10:16
整个夏天,我一直在使用“加速C ++”来学习C ++,但有一个我似乎不太了解的概念。为什么是int x;if (cin >> x){}相当于cin >> x;if (cin){}通过查看代码,在我看来我们正在使用cin作为变量。但是,我认为这是一个功能。当x的值等于我们在键盘上输入的值时,为什么还要以这种方式使用cin?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

cin是istream代表标准输入流的类的对象。它对应于cstdio流stdin。>>流的运算符重载返回对同一流的引用。可以通过转换运算符在布尔条件下将流本身评估为true或false。


cin提供格式化的流提取。手术 cin >> x;


如果输入非数字值,则“ x”为整数的位置将失败。所以:


if(cin>>x)

false如果您输入字母而不是数字,将返回。


有关使用C ++ I / O的技巧的本网站也将为您提供帮助。


查看完整回答
反对 回复 2019-11-12
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

注意:事实回答四年后才更新,以解决C ++ 98/03和C ++ 11(及更高版本)。


std::cin是的实例std::istream。该类提供了两个与此问题有关的重载。

  • operator >>如果可能,将数据从流中读取到目标变量中。如果流的立即内容不能转换为目标变量的类型,则将该流标记为无效,并且保持目标变量不变。无论操作成功与否,返回值都是对流的引用。

  • 任一operator void*()(预C ++ 11),其将流参照void*指针,或explicit operator bool()(C ++ 11),其将流参考一个布尔值。true如果流有效,此转换的结果是非空指针(C ++ 11之前)或(C ++ 11),但空指针(C ++ 11之前)或false(C ++ 11) )(如果流无效)。

一条if语句需要布尔值,整数或指针作为要测试的数量。的结果std::cin >> x是对的引用istream,而上述都不是。但是,该类istream确实具有那些转换运算符,可用于将istream引用转换为if语句中可用的内容。它是该语言用于if测试的特定于版本的转换运算符。由于读取if失败会将流标记为无效,因此如果读取无效,则测试将失败。

operator void*在C ++ 11之前使用更复杂的转换成员的原因是,直到C ++ 11才将现有explicit关键字扩展到适用于转换运算符和构造函数。非显式operator bool()的编程会给程序员带来太多机会,使他们无法自拔。也有问题operator void*()。“安全布尔成语”本来可以解决,但只需扩展即可explicit完全实现安全布尔成语所要完成的事情,而不必使用很多SFINAE魔术。


查看完整回答
反对 回复 2019-11-12
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

cin在std名称空间中是变量。


operator>>返回对的引用cin,因此您可以编写:cin >> a >> b,而不是cin >> a; cin >> b;


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 740 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信