地址和返回值的cin

时间:2016-11-30 18:58:18

标签: c++

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

这样的代码中
int a;  
if(cin>>a);

如果输入成功,cin将产生true,反之亦然 但是当我想输出bool值时,

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

它给出了一个地址:

0x6fcc41e8  

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

cout<<&cin<<endl;  

给出值

0x6fcc41e0

与8不同。
一个。为什么第一个cout给出地址而不是bool值? 湾为什么两个cout给出不同的地址? 感谢。

3 个答案:

答案 0 :(得分:4)

cin >> a返回流对象cin

在C ++ 11之前,std::istream有转换函数operator void*() const;,这意味着存在从std::istreamvoid*的隐式转换。指针的实际值没有意义,除了null值表示发生了故障,非null值表示成功。这样就可以使if (cin >> a)之类的内容正常工作。

您似乎正在使用C ++ 11之前的编译器或编译器设置,因此当您尝试输出它时,您将获得无意义的void*值。

在C ++ 11及更高版本中,std::istream具有转换函数explicit bool() const;,这意味着从std::istreambool的转换有效,但只有明确要求。 ifwhile计为明确请求转换为bool,但

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

没有,所以你的代码不能用C ++和更高版本编译。你需要

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

代替。

答案 1 :(得分:1)

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

  

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

这是因为一个istream对象必须&#34;隐含地转换为bool&#34;这样表达式可以在if语句的条件下使用。在C ++ 11之前,编译器通常允许将istream转换为void *。当您通过cin >> a运算符将<<的结果传递给cout时,它会选择此转换为void *并打印返回的任何地址。

  

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

这是因为编译器在转换为&cin时选择返回某个不是void *的地址。 (请注意,转换为void *的确切值无关紧要;只有值是否为NULL才有意义。)

答案 2 :(得分:-1)

boolalpha()返回ios_base&而非bool 改为使用:

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