| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7650 人关注过本帖
标题:while(~scanf("%d%d", &a, &b))printf("%d\n",a+b);这句不明 ...
只看楼主 加入收藏
sunb3
Rank: 2
来 自:北京
等 级:论坛游民
威 望:3
帖 子:34
专家分:94
注 册:2017-4-20
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:10 
while(~scanf("%d%d", &a, &b))printf("%d\n",a+b);这句不明
#include<stdio.h>
int main(){
    int a,b;
    while(~scanf("%d %d", &a, &b))printf("%d\n",a+b);
    return 0;
}

我大概能明白可以一直输入俩数,然后不断输出两个数的和,但是这个while怎么开始?又怎么结束呢?还有这个"~"的作用是什么?
搜索更多相关主题的帖子: return 
2017-05-03 08:42
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
~-1 为 0,就是说 scanf()返回-1(EOF)时跳出循环。
2017-05-03 10:00
sunb3
Rank: 2
来 自:北京
等 级:论坛游民
威 望:3
帖 子:34
专家分:94
注 册:2017-4-20
收藏
得分:0 
以下是引用吹水佬在2017-5-3 10:00:11的发言:

~-1 为 0,就是说 scanf()返回-1(EOF)时跳出循环。


那什么时候scanf()返回-1呢?是在输入内容无效的时候么?

除了基础……我什么都不会……
2017-05-03 10:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:1 
while( ~scanf("%d %d", &a, &b) )
应当写成
while( scanf("%d %d", &a, &b) == 2 )

在ACM比赛时,选手知道不会出现非法或残缺的数据,所以为了节约时间,写成第一种格式
2017-05-03 10:28
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用sunb3在2017-5-3 10:20:22的发言:



那什么时候scanf()返回-1呢?是在输入内容无效的时候么?

试试按 Ctrl+Z 回车
2017-05-03 10:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 5楼 吹水佬
scanf()出现读取错误才会返回EOF。

当然如楼主发的代码,有2个,输入ctrl+z的确可以终止循环,但对scanf用EOF做结束判断,并不好。

[此贴子已经被作者于2017-5-3 10:51编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-03 10:46
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:1 
以下是引用renkejun1942在2017-5-3 10:46:41的发言:

不用试。
ctrl+z 对scanf()没什么用。
scanf()出现读取错误才会返回EOF。

我windows平台下有用,这样看看:
#include <stdio.h>
main()
{
    int a,b;
    printf("%d\n", scanf("%d", &a, &b));
}
其他平台或者可试试 Ctrl+D
2017-05-03 10:51
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:1 
回复 7楼 吹水佬
试了下,竟然还真有用。

我就记得我被这个坑过一次,输入Ctrl+Z怎么都结束不了循环。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-03 10:57
sunb3
Rank: 2
来 自:北京
等 级:论坛游民
威 望:3
帖 子:34
专家分:94
注 册:2017-4-20
收藏
得分:0 
Ctrl+D在Linux经常用,没想到就是这个啊……

以下是引用rjsp在2017-5-3 10:28:37的发言:

while( ~scanf("%d %d", &a, &b) )
应当写成
while( scanf("%d %d", &a, &b) == 2 )

在ACM比赛时,选手知道不会出现非法或残缺的数据,所以为了节约时间,写成第一种格式


这个的确是什么ACM的题,ACM是赛什么的?…………不重要……
while( scanf("%d %d", &a, &b) == 2 )又是啥?……我有点懵了……
话说~scanf()是-1么?还是说Ctrl+D生成的EOF是-1?

除了基础……我什么都不会……
2017-05-03 15:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
以下是引用sunb3在2017-5-3 15:10:43的发言:

while( scanf("%d %d", &a, &b) == 2 )又是啥?
话说~scanf()是-1么?还是说Ctrl+D生成的EOF是-1?
scanf 返回正确读入的字段数目,假如发生错误,返回 EOF
以 scanf("%d %d", &a, &b) 为例,它可能返回 EOF012
如果发生了错误(比如无内容可读),返回EOF;
如果第一个%d格式就不对,返回0
如果第二个%d格式不对,返回1
如果第二个%d格式也对了,返回2
while( scanf("%d %d", &a, &b) == 2 ) 就是 a和b 都读成功了

Ctrl+D并不生成“EOF”,EOF是scanf的一种可能的返回值。
收到的鲜花
  • sunb32017-05-11 10:46 送鲜花  50朵   附言:非常感谢,我瞬间理解明白了T_T
2017-05-04 09:43
快速回复:while(~scanf("%d%d", &a, &b))printf("%d\n",a+b);这句不明 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018471 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved