while(scanf("%d %d",&a, &b) != EOF)
对这个条件,scanf()是在不能成功读入两个整形数据时返回EOF,你在这个期间向其中任意一个数据灌入Ctrl+Z,就能让这个数读取失败,触发错误,函数会结束返回EOF。scanf()函数的返回值,是它能够成功处理的数据个数,你这里要读2个数据,那么它可能成功1个或2个,则会返回1或2,但若出错就会返回EOF(-1)。一般地说,用scanf()!=2来作条件,比==EOF合适,因为读数出错的可能性有许多,比如试图读整数但输入的是无法解释成整数的字符串,解释失败,但却不会返回EOF,它只有在遇到特殊的数据时才会返回那个,所以不要检测那个东西。
用返回值来标志错误的做法,是远古时代参照汇编的思想,已经过时了,现在是直接返回错误码的,不应再使用错误数据来标识出错,因为把数据和错误码混淆在一起是不合理的。这是C语言的经典问题,《C陷阱》中就讲到这个,典型如getchar()就是误导性的,标明是char,却居然有-1这种不可能是char的数据返回,逻辑上就说不通,这还好辩护,但问题是有人经常用定义为unsigned char的变量来接收这个函数的返回值,却永远得不到EOF,那是害死人了。
[ 本帖最后由 TonyDeng 于 2013-4-14 01:04 编辑 ]
对这个条件,scanf()是在不能成功读入两个整形数据时返回EOF,你在这个期间向其中任意一个数据灌入Ctrl+Z,就能让这个数读取失败,触发错误,函数会结束返回EOF。scanf()函数的返回值,是它能够成功处理的数据个数,你这里要读2个数据,那么它可能成功1个或2个,则会返回1或2,但若出错就会返回EOF(-1)。一般地说,用scanf()!=2来作条件,比==EOF合适,因为读数出错的可能性有许多,比如试图读整数但输入的是无法解释成整数的字符串,解释失败,但却不会返回EOF,它只有在遇到特殊的数据时才会返回那个,所以不要检测那个东西。
用返回值来标志错误的做法,是远古时代参照汇编的思想,已经过时了,现在是直接返回错误码的,不应再使用错误数据来标识出错,因为把数据和错误码混淆在一起是不合理的。这是C语言的经典问题,《C陷阱》中就讲到这个,典型如getchar()就是误导性的,标明是char,却居然有-1这种不可能是char的数据返回,逻辑上就说不通,这还好辩护,但问题是有人经常用定义为unsigned char的变量来接收这个函数的返回值,却永远得不到EOF,那是害死人了。
[ 本帖最后由 TonyDeng 于 2013-4-14 01:04 编辑 ]
授人以渔,不授人以鱼。