关于if(!cin) return false;这行代码相关的一些小结

在C++ primer plus第五版的678页的程序清单中,
</pre><ol><li>bool FillReview(Review&rr)</li><li>{</li><li><span style="white-space: pre;">	</span>cout<<"Enter book title (quit to quit):";</li><li><span style="white-space: pre;">	</span>getline(cin,rr.title);</li><li><span style="white-space: pre;">	</span>if(rr.title=="quit")</li><li><span style="white-space: pre;">	</span>return false;</li><li><span style="white-space: pre;">	</span>cout<<"Enter book rating:";</li><li><span style="white-space: pre;">	</span>cin>>rr.rating;<span style="white-space: pre;">	</span></li><li><span style="white-space: pre;">	</span>double a=!cin;</li><li><span style="white-space: pre;">	</span>if(!cin)</li><li><span style="white-space: pre;">		</span>return false;</li><li>while(cin.get()!='\n')</li><li>    continue;</li><li>return true;</li><li>}</li></ol><p>起初见到第10,11行代码的时候是觉得很奇怪,这if(!cin)到底怎么判断?后面跟个return false有啥意义?</p><p>一般if是用来判断括号内的事件真假的,如果!cin不为0就是真,那么if事件成立,则这个函数<span style="white-space:pre">bool FillReview(Review&rr)</span>就要返回false了,而在主函数里面如下</p><p></p><ol><li>int _tmain(int argc, _TCHAR* argv[])</li><li>{</li><li><span style="white-space: pre;">	</span>vector<Review> books;</li><li><span style="white-space: pre;">	</span>Review temp;</li><li><span style="white-space: pre;">	</span>while(FillReview(temp))</li><li><span style="white-space: pre;">		</span>books.push_back(temp);</li><li><span style="white-space: pre;">	</span>int num=books.size();</li><li><span style="white-space: pre;">	</span>if(num>0)</li><li><span style="white-space: pre;">	</span>{</li><li><span style="white-space: pre;">		</span>cout<<"Thank you.You enterd the following:\n"</li><li><span style="white-space: pre;">			</span><<"Rating\tBook\n";</li><li><span style="white-space: pre;">		</span>for(int i=0;i<num;i++)</li><li><span style="white-space: pre;">		</span>{</li><li><span style="white-space: pre;">		</span>  ShowReview(books[i]);</li><li><span style="white-space: pre;">		</span>}</li><li><span style="white-space: pre;">		</span>cout<<"Reprising:\n"</li><li><span style="white-space: pre;">			</span><<"Rating\tBook\n";</li><li><span style="white-space: pre;">		</span>vector<Review>::iterator pr;</li><li><span style="white-space: pre;">		</span>for(pr=books.begin();pr!=books.end();pr++)</li><li><span style="white-space: pre;">			</span>ShowReview(*pr);</li><li><span style="white-space: pre;">		</span> vector<Review>oldlist(books);</li><li><span style="white-space: pre;">		</span> if(num>3)</li><li><span style="white-space: pre;">		</span> { books.erase(books.begin()+1,books.begin()+3);</li><li><span style="white-space: pre;">		</span> cout<<"After eeasure:\n";</li><li><span style="white-space: pre;">		</span> for(pr=books.begin();pr!=books.end();pr++)</li><li><span style="white-space: pre;">			</span> ShowReview(*pr);</li><li><span style="white-space: pre;">		</span> }</li><li><span style="white-space: pre;">	</span>}</li><li><span style="white-space: pre;">	</span>else </li><li><span style="white-space: pre;">		</span>cout<<"Nothing entered,nothing gained.\n";</li><li></li><li></li><li><span style="white-space: pre;">	</span>return 0;</li><li>}</li></ol><pre name="code" class="cpp">
可见 bool FillReview(Review&rr)是在主函数的第5行里面作为while(FillReview(temp))的判断值调用的(这里可以明白用一个bool型函数去做if或者while的判断语句是有好处的),如果bool FillReview(Review&rr)返回false那么while(FillReview(temp))就是假,那么跳出while循环,也就是books.push_back(temp)不再执行,也就是不能再添加数据了。如下就要进入主函数的if(num>0)判断了。

所以这里的if(!cin)是关系到整个程序的输入的,所以!cin很重要。

经过调试我发现了,这里
cin>>rr.rating;也就是与rating有关的,

<ol><li><span style="font-family: Arial, Helvetica, sans-serif;">struct Review{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	string title;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	int rating;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">};</span></li></ol>

在这个数据结构里,对于rating是定义为int类型的。

当我在输入非数据类型如abs这样的值给rr.rating的时候,我发先double a=!cin这里的a居然是取值为1了,也就是!cin为1,即是cin为0,也就是if被判断为真。那么就返回了false了,整个输入到此结束了。而我输入123这些正常数字的时候,那么就可以继续。

为此我将rating的类型该为string了,这个时候无论我输入abs还是123,这个时候!cin都为0了,也就是不会进入if语句中了。

如此,我算明白了if(!cin) return false这个组合主要是防止输入错误的数据。

往往是在要求输入int类型这种约束高的数值输入时候要去判断。

下面给出全部代码

<ol><li><span style="font-family: Arial, Helvetica, sans-serif;">// testcode.cpp : 定义控制台应用程序的入口点。</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//</span></li><li>
</li><li>
</li><li><span style="font-family: Arial, Helvetica, sans-serif;">#include "stdafx.h"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//#include<iostream></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//#include<string></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">#include<vector></span></li><li>
</li><li>
</li><li><span style="font-family: Arial, Helvetica, sans-serif;">#include"struct.h"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">using namespace std;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//struct Review{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">string title;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">int rating;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//};</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">bool FillReview(Review &rr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">void ShowReview(const Review &rr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">int _tmain(int argc, _TCHAR* argv[])</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">vector<Review> books;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">Review temp;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">while(FillReview(temp))</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">books.push_back(temp);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">int num=books.size();</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">if(num>0)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Thank you.You enterd the following:\n"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;"><<"Rating\tBook\n";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">for(int i=0;i<num;i++)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">  ShowReview(books[i]);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Reprising:\n"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;"><<"Rating\tBook\n";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">vector<Review>::iterator pr;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">for(pr=books.begin();pr!=books.end();pr++)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;">ShowReview(*pr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> vector<Review>oldlist(books);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> if(num>3)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> { books.erase(books.begin()+1,books.begin()+3);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> cout<<"After eeasure:\n";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> for(pr=books.begin();pr!=books.end();pr++)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;"> ShowReview(*pr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> }</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">else </span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Nothing entered,nothing gained.\n";</span></li><li>
</li><li>
</li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">return 0;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">bool FillReview(Review&rr)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Enter book title (quit to quit):";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">getline(cin,rr.title);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">if(rr.title=="quit")</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">return false;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Enter book rating:";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cin>>rr.rating;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">double a=!cin;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">if(!cin)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">return false;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">while(cin.get()!='\n')</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">    continue;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">return true;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">void ShowReview(const Review &rr)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<rr.rating<<"\t"<<rr.title<<endl;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li></ol>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值