今天刷 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