我的代码符合我的预期,但我无法弄清楚原因。
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;
没有运行。
那么有人可以指出问题所在吗?
答案 0 :(得分:3)
让我们通过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
。