我是C ++初学者,我被告知在像
这样的代码中int a;
if(cin>>a);
如果输入成功,cin将产生true,反之亦然 但是当我想输出bool值时,
cout<<boolalpha<<(cin>>a)<<endl;
它给出了一个地址:
0x6fcc41e8
我还被告知cin
是一个对象,但是
cout<<&cin<<endl;
给出值
0x6fcc41e0
与8不同。
一个。为什么第一个cout
给出地址而不是bool值?
湾为什么两个cout
给出不同的地址?
感谢。
答案 0 :(得分:4)
cin >> a
返回流对象cin
。
在C ++ 11之前,std::istream
有转换函数operator void*() const;
,这意味着存在从std::istream
到void*
的隐式转换。指针的实际值没有意义,除了null值表示发生了故障,非null值表示成功。这样就可以使if (cin >> a)
之类的内容正常工作。
您似乎正在使用C ++ 11之前的编译器或编译器设置,因此当您尝试输出它时,您将获得无意义的void*
值。
在C ++ 11及更高版本中,std::istream
具有转换函数explicit bool() const;
,这意味着从std::istream
到bool
的转换有效,但只有明确要求。 if
或while
计为明确请求转换为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;