使用布尔运算符扫描时



我今天看到了这段代码:

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返回它匹配的参数数,但第一个代码片段抛出该结果,并检查xy是否为true。第二个片段返回您至少匹配了一个整数,而与值无关。

考虑输入"0 0"。在第一种情况下,scanf()返回2,但x || y返回false。在第二种情况下,您的条件是true

第一个代码给while x||y的结果,这是正确的

然而,第二个代码比较scanf1的返回值,然后给出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;
}