c/c++ cin>> cout<< scanf() printf() 返回值

来源:互联网 发布:js bytearray 遍历 编辑:程序博客网 时间:2024/05/16 13:06
1.scanf函数返回成功读入的数据项数,读到文件末尾出错时则返回EOF。
如:
1
scanf("%d %d",&a,&b);
while(scanf("%d %d",&a,&b)!=EOF);//acm中常用在读入未知数据 数多少时的情况
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。

2.printf函数返回值是整型值,其值为printf实际控制输出的字符数。
例如:
1
2
3
4
printf"%d"printf("baijia"));

//输出为:baijia6

3.cin 为iostream 类的一个对象,对象是无返回值的,>>为位运算符的重载,而>>操作符返回的是操作的流的引用,也就是istream&。
while (cin >> a >> b);

while里面判断的是bool值,不能判断istream&,打开<ISTREAM>头文件,找到类模板basic_istream的定义:

        typedef basic_istream<_E, _Tr> _Myt;          

        _Myt& operator>>(......) ......

说明cin >>的返回值类型就是basic_istream&,while()中要求是布尔表达式,难不成basic_istream&类型可以转换成bool类型?继续查看头文件,发现所有的operator重载函数都是<<和>>,没有找到用于类型转换的操作,追溯到父类basic_ios,打开头文件<ios.h>,找到ios中类型转换函数的定义:

operator void *() const{

 if(state&(badbit|failbit) )

return 0; 

return (void*)this;

}

编译器会在需要的情况下将ios类型自动转换为void*类型。因此,在表达式while (cin >> m >> n)中,括号中的表达式为了匹配bool类型将自动转换为void*类型。如果读入时发生错误返回0,否则返回cin的地址。


另附:windows 中键盘输入替代文件中EOF的是Ctrl+Z

0 0
原创粉丝点击