为什么while(scanf(“%lld”,& num)== 1)比while(scanf(“%lld”,& num))

时间:2016-09-16 16:18:34

标签: c++ onlinejudge

我试图解决Uva Online Judge的问题。问题编号是10302.我接受的代码如下所示。

 #include <cstdio>

 int main()
 {
     long long int num, sum;

     while(scanf("%lld", &num) == 1)  {

        //sumOfCube(sum, num);
        //sum = (long long int)(num * num * (num + 1) * (num + 1)) / 4;
        printf("%lld\n", ((num * num) * ((num + 1) * (num + 1))) / 4);
    }

    return (0);
}

此处我的时间限制超出了代码

#include <cstdio>

int main()
{
    long long int num, sum;


    while(scanf("%lld", &num))  {

        //sumOfCube(sum, num);
        //sum = (long long int)(num * num * (num + 1) * (num + 1)) / 4;
        printf("%lld\n", ((num * num) * ((num + 1) * (num + 1))) / 4);
    }

    return (0);
}

唯一的区别是

 while(scanf("%lld", &num) == 1)

 while(scanf("%lld", &num))

我认为第二个更快。因为第一个添加额外的运算符==来检查相等性。右侧已经true (1),当scanf()接受输入时,左侧是true。如果双方都是true,则while循环为真。我认为这是一个额外的时间损失。

但是我无法理解为什么法官选择第一个更快。

任何人请解释一下。

1 个答案:

答案 0 :(得分:4)

您的第二个版本有无限循环

scanf返回EOF(可能是-1的一个宏,虽然这在某种程度上取决于你的系统)当输入用尽时,这个返回值很令你满意条件松散。

你对第二个人的合理化是更快&#34;因为你没有写== 1没有意义(C ++一次不执行一个源代码字符!),这就是为什么你应该更喜欢理解逻辑<的一个很好的例子/而不是花费你所有的时间来尝试微优化。

下次在代码中添加一些调试输出,或者通过调试器运行程序。你很快就能看到发生了什么。