C语言 :~scanf 与 scanf 天差地别

今天刷 PTA —1010题 的时候,写完这个题目后,再去百度看看别人写的代码比较比较 , 发现 别人的代码中 有 ~scanf , 以前写代码没用过,现在在此总结一下


在这里插入图片描述


题目较为简单,不给予解释

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void) {
    int coe, exp, flag = 0;
    while (~scanf("%d%d", &coe, &exp)) {
        //如果多项式的第一项的指数为0,求导后即为“零多项式”,则应输出0 0
        //用flag == 0来识别第一项
        if ((exp == 0) && (flag == 0)) {
            printf("%d %d", exp, exp);
            break;
        }
        //如果第一项的指数不为0,则后面指数为0的项不必输出
        else if (flag == 0) {
            if (exp != 0) {
                printf("%d %d", coe * exp, exp - 1);
                flag = 1;
            }
        }
        else {
            if (exp != 0) {
                printf(" %d %d", coe * exp, exp - 1);
            }
        }
    }
    system("pause");
    return EXIT_SUCCESS;
}

三、问题原因:

  • 首先明确scanf("%d%d",&n,&m),输入正确的nm之后,返回的是2,说明调用成功,但是如果输入的nm不正确会 返回-1
  • 通常计算机中EOF = -1
  • while(cin>>n>>m))–>等价于 while(scanf("%d%d",&n,&m)!=EOF)–>还等价于 while(~scanf("%d%d",&n,&m))
  • 因为while(-1)跳不出来,所以程序就一直在后台跑啊跑,最后给你讲它TLE,然后滚回去优化算法,发现还是TLE
  • 对于后者,~ 是一个位运算符:按位取反,当键盘输入文件结束EOF时,while循环退出,因为~EOF = 0

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/106755461