|
发表于 2018-2-20 10:00:07
|
显示全部楼层
本帖最后由 xiaoxiaoshaonia 于 2018-2-20 10:05 编辑
- while( ~scanf("%d %d", &a, &b) )
复制代码
应当写成
- while( scanf("%d %d", &a, &b) == 2 )
复制代码
在ACM比赛时,选手知道不会出现非法或残缺的数据,所以为了节约时间,写成第一种格式
scanf 返回正确读入的字段数目,假如发生错误,返回 EOF
以 scanf("%d %d", &a, &b) 为例,它可能返回 EOF、0、1、2
如果发生了错误(比如无内容可读),返回EOF;
如果第一个%d格式就不对,返回0
如果第二个%d格式不对,返回1
如果第二个%d格式也对了,返回2
while( scanf("%d %d", &a, &b) == 2 ) 就是 a和b 都读成功了
GCC的EOF规定为-1,而-1在内存里以补码形式存放,为11111...111全为1,而~位取反则把它变成了000..0000全为0,也就是正数0。
因此-1位取反为0,用作逻辑判断,不过确实不太好用,(scanf .. == 2)更好。以下代码说明:
程序代码:
- printf("EOF = %d , %d\n",EOF,~EOF);
复制代码
|
|