字符串流运算符>>停止问题

stringstream operator>> stop issues

本文关键字:gt 问题 字符串 运算符      更新时间:2023-10-16

我有以下代码超出了我的预期,但我不知道为什么。

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 && ss2true,这意味着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循环:

  1. 执行ss1 >> v1,结果为truev1 == 1
  2. 执行ss2 >> v2,结果为truev2 == 1
  3. 执行v1 == v2,结果为true
  4. 循环体被执行(什么都没发生,它是空的)
  5. 执行ss1 >> v1,结果为false,因为在ss1中没有更多的int

这意味着条件的其余部分将不会被执行,因为这有什么意义?while循环不会重复,因为一个值已经是false。这称为短路评估

ss1提取失败,因此它将返回false,但ss2从未尝试提取,因此它返回true,因此您的输出为:-1