这篇“C++中cin>>n的返回值是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中cin>>n的返回值是什么”文章吧。
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { int n,temp; vector<int> arr; while(cin>>n) { for(int i=0;i<n;i++) { cin>>temp; arr.push_back(temp); } sort(arr.begin(),arr.end()); for(int i=0;i<n;i++) cout<<arr[i]<<" "; cout<<endl; system("pause"); return 0; } }
如果要输出正确结果,这个判断条件必须在客户想要结束程序的时候结束输入,要怎么做呢?如果输入一个错误的类型,cin会失效,循环也会停止,但是这样做毕竟是个错误,那么究竟要怎样做才能正常结束这个循环呢?
【注意】
cin>>n返回的也是一个cin对象,当一个cin对象作为条件选择、循环等的控制表达式时,编译器会将其转换为真值表达式,如果cin的iostate为goodbit,则这个真值表达式的结果为真,否则为假。
输入一个非数字可以置位failbit,从而结束循环,当然这是一个非正常退出。
正常退出可以用键盘模拟产生EOF,表示流输入结束了。在windows中可以输入ctrl+z,unix/linux中则为ctrl+d。
scanf是一个函数,它的返回值是一个int,该int代表scanf成功读取到数据的个数,如果读到文件末尾或者输入ctrl+z标志读取完毕的时候就会读到EOF,这是它会返回0,相当于false;
int n; while (scanf("%d", &n) != EOF) { getchar();//吃掉回车 cout<<n<<endl; }
首先 cin是一个ios(iostream)中的对象,那么他不是函数,不存在什么返回值;
int n; while (cin>>n) { cout << "flag" << endl; }
这段程序看起来好像cin返回了值作为while中的条件判断,实际上cin是一个对象,无返回值,而这个返回值是std中重载>>这个运算符返回的,其类型是一个istream&,这也说明了可以cin>>a>>b这样连用的场景;
那么既然返回值是一个istream&类型,那么这个类型的对象怎么作为条件逻辑判断的呢?
istream作为ios继承的一个类型,其中重载了bool这个操作符别名,使得istream其对象可以调用bool操作符(相当于加了一个本类型与bool类型的转换函数),该函数选择性的返回给条件判断语句true或者false,比如istream的对象 如果收到EOF(ctrl+z)就会return false,这也说明了while(cin>>n)当传入EOF能停下来的原因;
则下面两段代码等价:
int n; while (cin>>n) { cout << "flag" << endl; } int n; while ((cin>>n).bool()) { cout << "flag" << endl; }
如果某个类型没有重载bool操作符,那么它就不能用于条件逻辑判断;
class A { public: int a = 0; }; int main() { A a; if (a) cout << 1 << endl; else cout << 0 << endl; return 0; }
添加重载bool操作符;
class A { public: int a = 0; operator bool()//注意 转换函数比较特殊 无返回值 { if(a==0) return false; return true; } }; int main() { A a; if (a) cout << 1 << endl; else cout << 0 << endl; return 0; }
要注意的是 这里operator bool()相当于是一个原生类型与bool类型的转换函数,会返回一个bool值给逻辑表达式作为判断,但是重载operator bool()的时候无返回值!这是其特殊的地方!
因此,若想使用自定义类型作为逻辑判断表达式的判断依据,只要在这个类型中设置转换函数即重载operator bool()即可。
以上就是关于“C++中cin>>n的返回值是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。