CIN的地址和返回值

Address and return values of cin

本文关键字:返回值 地址 CIN      更新时间:2023-10-16

我是C 初学者,我被告知在

之类的代码中
int a;  
if(cin>>a);

如果输入成功,CIN将产生真实,反之亦然。
但是当我想输出bool值时,

cout<<boolalpha<<(cin>>a)<<endl;  

它给出一个地址:

0x6fcc41e8  

我也被告知cin是一个对象,但是

cout<<&cin<<endl;  

给出值

0x6fcc41e0

不同的8个。
A。为什么第一个cout给出地址而不是布尔值?
b。为什么两个cout给出不同的地址?
谢谢。

cin >> a返回流对象cin

直到C 11,std::istream具有转换函数operator void*() const;,这意味着从std::istreamvoid*有隐式转换。指针的实际值毫无意义,除了无效的值意味着发生故障,而非零值意味着成功。这允许诸如if (cin >> a)之类的事情正常工作。

看来您使用的是Pre-C 11编译器或编译器设置,因此当您尝试输出它时,您可以获得毫无意义的void*值。

在C 11及以后,std::istream改为具有转换功能explicit bool() const;,这意味着从std::istreambool有有效的转换,但仅在明确要求的情况下。ifwhile被认为是明确要求转换为bool的,但是

cout<<boolalpha<<(cin>>a)<<endl;

不会,因此您的代码不会在C 11及更高版本中编译。您需要

cout << boolalpha << static_cast<bool>(cin>>a) << endl;

而不是。

首先,观察cin >> a的结果是对ISTream对象的引用。

为什么第一个cout给出地址而不是布尔值?

这是因为必须"暗示可转换到bool",以便可以在if语句的条件下使用该表达式。在C 11之前,通常允许将ISTream转换为void *。当您通过cin >> a的结果通过<<操作员来表达COUT时,它选择了此转换为void *并打印返回的任何地址。

为什么两个cout给出不同的地址?

这是因为编译器选择转换为void *时返回某些不是&cin的地址。(请记住,转换为void *的确切值是无关的;仅该值是NULL是否相关。)

boolalpha()返回 ios_base&不是布尔而是使用:

cout << (bool)(cin >> x) << endl;