字符串流运算符>>停止问题
stringstream operator>> stop issues
我有以下代码超出了我的预期,但我不知道为什么。
stringstream ss1("01"), ss2("1");
int v1, v2;
while (ss1 >> v1 && ss2 >> v2 && v1 == v2) {}
if (ss1 && !ss2)
cout << 1;
else if (!ss1 && ss2)
cout << -1; // <== this line will execute
else
cout << 0;
我原以为结果是cout << 0
,但它执行的是行cout << 1
,这意味着!ss1 && ss2
就是true
。
由于!ss1 && ss2
是true
,这意味着ss2
还没有停止。为了检查这一点,我又添加了两行,这样代码就变成了
stringstream ss1("01"), ss2("1");
int v1, v2;
while (ss1 >> v1 && ss2 >> v2 && v1 == v2) {}
while (ss2 >> v2) // these two lines are added to check
cout << "v2: " << v2 << endl; // whether ss2 really goes to the end.
if (ss1 && !ss2)
cout << 1;
else if (!ss1 && ss2)
cout << -1;
else
cout << 0;
但是,线路cout << "v2: " << v2 << endl;
没有运行。
那么,有人能指出问题出在哪里吗?
让我们来看看while
循环:
- 执行
ss1 >> v1
,结果为true
(v1 == 1
) - 执行
ss2 >> v2
,结果为true
(v2 == 1
) - 执行
v1 == v2
,结果为true
- 循环体被执行(什么都没发生,它是空的)
- 执行
ss1 >> v1
,结果为false
,因为在ss1
中没有更多的int
这意味着条件的其余部分将不会被执行,因为这有什么意义?while
循环不会重复,因为一个值已经是false
。这称为短路评估。
ss1
提取失败,因此它将返回false
,但ss2
从未尝试提取,因此它返回true
,因此您的输出为:-1
。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题