今天做了一个山师Online Judge里面一道题,不断输入成对的值让你求和,你需要判断什么时候他停止输入。

一开始我用了如下表达式

(cin>>a)!=0&&(cin>>b)!=0

结果自己测试的时候一切正常,但是他这个老六给我送了一组致命的数据:

0 0

我服了这个老六。

上网查资料发现这么一个表达式:

scanf("%d%d",&a,&b)

这个表达式能在输入a,b的同时返回一个值。

其中:

  • 若a,b都成功输入,则返回值2;
  • 若仅输入成功一个,则返回值1;实际上,仅输入成功一个的话,那这个值必然是a成功输入了,因为若a输入失败,则b自然不会被输入。
  • 若均未输入成功,则返回值0;
  • 若输入遇到错误,则会返回值-1

所以,可以使用表达式

scanf("%d%d",&a,&b)!=-1

来判断是否输入完毕。


但是,在查找资料的时候发现这么一个情形

(参考了该篇文章https://blog.csdn.net/henu1710252658/article/details/83040281

但是在C++中不存在这种用法,但相同作用的有while((cin >> a) != 0)
以前不理解在while里面用cin >> a;是什么意思,cin是C++的输入流对象,">>"是重载的运算符,cin>>的返回值是cin对象。用这个当条件的话,通过检测其流的状态来判断结束;
(1)若流是有效的,即流未遇到错误,那么检测成功;
(2)若遇到文件结束符,或遇到一个无效的输入时(例如本题输入的值不是一个整数),istream对象的状态会变为无效,条件就为假;读取失败的时候,就不能继续读取了,那么读取操作结束,while(cin>>a)就返回false,跳出循环!
C++中的while (cin>>n,n)
他的作用是:输入一个数,这数不为0时进入循环,为0时跳出循环。
————————————————
版权声明:本文为CSDN博主「一个奔跑的C」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/henu1710252658/article/details/83040281

我开篇提到了,我一开始就是用的这个表达式。

但是鸡贼的地方在哪儿呢?

看几个代码块儿:1.while(1),2.while(0),3.while(false)

相信很容易看出来1表达式会进行循环,2和3都会跳出循环。

当输入错误的时候,while((cin >> a) != 0)确实会起作用,但是如果一个老六给你一组数据0 0呢?

不过,某种程度上,while((cin >> a) != 0)确实是起作用的。唯一出现问题的地方就是0false都会被认为是false.

如果觉得我的文章对你有用,请随意赞赏