而scanf用布尔运算符

时间:2014-11-01 16:11:13

标签: c++

我今天看到了这段代码:

while(scanf("%d %d",&x,&y),x||y)
{
    ....

根据我的理解,如果某些值(x或y)为真,它就会进入循环。

由于scanf docs说:

  

成功时,该函数返回参数的项数   列表已成功填写。此计数可以匹配预期的数量   由于匹配失败,读数,项目或更少(甚至为零)   错误,或文件结尾的范围。

我已将代码重写为:

while(scanf("%d %d",&x,&y) >= 1)
{
   ....

但是online programming challenge site第一次有效时,第二次失败。

我对我的假设是否正确?这两段代码之间有什么区别?

(我标记为C ++,因为我已在C ++ 4.8.2中测试过 - GNU C ++编译器)

2 个答案:

答案 0 :(得分:3)

scanf返回它匹配的参数数量,但第一个代码片段抛出该结果,只是检查xy是否为真。第二个片段返回您匹配的至少一个整数,无论​​其值如何。

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

答案 1 :(得分:0)

第一个代码为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;
}