今天做了一个山师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)
确实是起作用的。唯一出现问题的地方就是0
和false
都会被认为是false
.