我今天看到了这段代码:
while(scanf("%d %d",&x,&y),x||y)
{
....
据我所知,如果某些值(x或y)为真,它就会进入循环。
由于扫描文件显示:
成功后,函数返回参数的项数列表已成功填写。此计数可以与预期的项或由于匹配失败而减少(甚至为零)错误,或到达文件末尾。
我已将代码改写为:
while(scanf("%d %d",&x,&y) >= 1)
{
....
但在一个在线编程挑战网站上,第一个虽然有效,但第二个失败了。
我的假设正确吗?这两段代码之间有什么区别?
(我标记为C++,因为我在C++4.8.2-GNU C++编译器中进行了测试)
scanf
返回它匹配的参数数,但第一个代码片段抛出该结果,并检查x
或y
是否为true。第二个片段返回您至少匹配了一个整数,而与值无关。
考虑输入"0 0"
。在第一种情况下,scanf()
返回2,但x || y
返回false
。在第二种情况下,您的条件是true
。
第一个代码给while
x||y
的结果,这是正确的
然而,第二个代码比较scanf
和1
的返回值,然后给出while
的比较结果。
运行此代码,您就会明白。
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int x, y;
cout<<(scanf("%d %d", &x, &y), x||y)<<endl;
cout<<(scanf("%d %d", &x, &y))<<endl;
return 0;
}