stringstream operator>>停止问题

时间:2016-04-16 15:55:45

标签: c++ string

我的代码符合我的预期,但我无法弄清楚原因。

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 && ss2true

由于!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;没有运行。

那么有人可以指出问题所在吗?

1 个答案:

答案 0 :(得分:3)

让我们通过while循环:

  1. ss1 >> v1被执行,结果为truev1 == 1
  2. ss2 >> v2被执行,结果为truev2 == 1
  3. 执行
  4. v1 == v2,结果为true
  5. 执行循环体(没有任何反应,它是空的)
  6. ss1 >> v1被执行,结果为false,因为int
  7. 中不再有ss1

    这意味着剩下的条件不会被执行,因为重点是什么? while循环不会重复,因为一个值已经false。这称为短路评估

    ss1提取失败,因此会返回false,但ss2从未尝试过提取,因此会返回true,因此输出为-1