CIN的地址和返回值
Address and return values of cin
我是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::istream
到void*
有隐式转换。指针的实际值毫无意义,除了无效的值意味着发生故障,而非零值意味着成功。这允许诸如if (cin >> a)
之类的事情正常工作。
看来您使用的是Pre-C 11编译器或编译器设置,因此当您尝试输出它时,您可以获得毫无意义的void*
值。
在C 11及以后,std::istream
改为具有转换功能explicit bool() const;
,这意味着从std::istream
到bool
有有效的转换,但仅在明确要求的情况下。if
或while
被认为是明确要求转换为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;
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 指针返回值的地址
- 获取“将返回值分配给新变量”的警告和输出是内存地址
- 地址数组,带有枚举的返回值
- CIN的地址和返回值
- 数组中的值之和返回内存地址,除非sizeof(array)/2
- C++标准是否保证函数返回值具有常量地址?
- 为什么指针返回值,而不是地址
- 如何在C++中获取函数返回值的地址
- C++返回内存地址而不是值
- 方法的返回值的地址
- CMSIS-RTOS 的 osMailFree() 返回一些地址而不是 osStatus-type 值
- 为什么指针返回值而不是地址