我有以下代码超出了我的期望,但是我不知道为什么。
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
,因为int
中不再有ss1
这意味着其余条件将不会执行,因为这有什么意义? while
循环不会重复,因为一个值已经是false
。这称为短路评估。ss1
提取失败,因此将返回false
,但是ss2
从未尝试提取,因此它返回true
,因此输出:-1
。
关于c++ - stringstream运算符>>停止问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36666378/