关于标准io的练习要求我:
读取标准输入的输入并将其写入标准输出.
可能的解决方案是:
#include<iostream>
#include<string>
using std::cin; using std::cout;
using std::string;
int main()
{
string word;
while (cin >> word)
cout << word;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,字符串充当缓冲区.如果有人试图通过执行以下操作来摆脱缓冲区:
#include<iostream>
using std::cin; using std::cout;
int main()
{
while (cout << cin)
;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果非常不同.当我运行这段代码时,我得到一个无休止的流
0x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d30
在终端上.
为什么会这样?为什么这些程序的行为有所不同?
cout << cin不会按你想要的方式工作.在C++ 11及更高版本中,它甚至不会编译.
你看到了(现在过时的)"安全布尔"成语的不幸副作用.
在C++ 11之前,a std::istream 可以隐式转换为a void*来模拟bool语义. (从C++ 11开始,explicit operator bool() const填充该角色)
因此,代码:
while (cout << cin)
Run Code Online (Sandbox Code Playgroud)
在C++ 98或C++ 03中编译,因为它可以隐式转换为:
while (cout << static_cast<void*>(cin) )
Run Code Online (Sandbox Code Playgroud)
void*当cin未处于错误状态时,允许此转换生成任何非NULL .在你的情况下,它正在生成指针0x600d30.
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |