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

本文探讨了C/C++中cin、cout、scanf和printf的返回值特性,特别是cin>>操作符的返回值类型。在while循环中,cin>>的返回值会被隐式转换为bool值,当读取输入发生错误时,返回值为0,否则返回cin的地址。此外,介绍了在Windows环境下,Ctrl+Z作为键盘输入的EOF替代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值