请教cin的特性和常引用的问题
本人有两个问题求教各位。
1. cin的使用问题
- C/C++ code
#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ int val = 0; int sum = 0; while (false == (cin >> val).fail()) { sum += val; } cout << "sum is " << sum << endl; system("pause"); return 0;}这段代码就是求从键盘上输入的数字之和。假设我输入:1回车2回车3a回车
求和的结果是6.即1+2+3
我想问一下,这里的3为什么会被识别了?为什么不是把3a一起作为非法字符加以舍弃呢?
2. 关于常引用的问题
- C/C++ code
int i = 1, j = 2;const int& k = i + j;
编译器对待上述常引用定义的处理是为i+j的值创建一个临时变量,假设为temp,然后将temp作为常引用捆绑的对象。
这么一来,常引用的定义,就会产生一个所谓副本的概念,是需要占用空间的。也就是说,像如下的函数定义方式:
- C/C++ code
void f(const A& a){//some codes}在实参和形参结合的时候,会产生副本。从效率上讲,是不是和如下定义方式一个级别了?
- C/C++ code
void f(A a){//some codes}如果这样的话,那是不是从效率的角度考虑,函数的形参表中,纯引用(非常引用)的方式,效率更高呢?
[解决办法]
1.cin的识别是尽可能贪婪地进行输入识别,所以‘3a’会被识别为3,而不是一个完整的非法字符串,这和atoi函数的结果是一致的。atoi("3a")的结果是3
2.从编译器的角度来看,引用实际上就是指针,这意味着传递引用实际上只是传递了一个整数地址。一般情况下,效率是较高的,但如果参数本身就是一个char,int等小结构,则用引用来提升效率的做法得不偿失。另一方面,引用不完全是为效率考虑的,如果需要输出多个返回值,传一个引用参数,在方法内部通过该参数设置返回值亦可。
[解决办法]
>我想问一下,这里的3为什么会被识别了?为什么不是把3a一起作为非法字符加以舍弃呢?
读到3a这行,读进3,碰到a不是数字就仍然把它放缓冲区,并且这次读取成功完成。
然后缓冲区开头是a,这次碰到a就fail了。
>常引用的定义,就会产生一个所谓副本的概念
出现拷贝是因为i+j而不是因为const int&。
[解决办法]
[解决办法]