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

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

那么谁能指出问题出在哪里呢?

最佳答案

让我们来看一下while循环:


ss1 >> v1被执行,结果为truev1 == 1
ss2 >> v2被执行,结果为truev2 == 1
v1 == v2被执行,结果为true
循环体被执行(什么也没有发生,它为空)
ss1 >> v1被执行,结果为false,因为int中不再有ss1


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

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

关于c++ - stringstream运算符>>停止问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36666378/

10-10 11:56