C++排雷:3.for循环配合cin输入流终止——控制台未知的快捷键Ctrl+Z
看到了这样的一段代码:
#include<iostream>
using namespace std;
int main()
{
cout << "请输入一些数,按ctrl+z结束\n";
int sum(0), value(0);
for (; cin>>value; )
{
sum += value;
}
cout << "读入的数和为" << sum << endl;
return 0;
}
代码中的for控制体中,只有一个cin语句。在循环体中提示可以Ctrl+Z结束循环。这个是我之前没有遇到的,虽然这个需求可以轻松地靠while循环解决,但是本人还是很好奇它是怎么处理的?
在本人的VS2019中,运行后,Ctrl+z并不能终止输入循环,这里可能是本人的快捷键有冲突?所以本人打开了Win10的设置界面:

进入“输入语言热键”:

把搜狗拼音输入法的给关了= =
再运行原代码试一试,输入几个数字,然后直接空回车,没有反应,用Ctrl+z,界面出现了^z,这时再回车,就跳出了循环将最后结果输出:

那么这个快捷键到底是何方神圣呢?重新看一看for循环的说明文档:
for ( init; condition; increment )
{
statement(s);
}
下面是 for 循环的控制流:
-
init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
-
接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for循环的下一条语句。
-
在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
-
条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
那么程序中的for (; cin>>value; ),只有中间的condition语句,一进循环就判断条件cin输入流,如果是TRUE会进入循环,那么这个cin返回的是什么呢?换句话说,为什么我输入了空回车,还能进入下一个循环呢?
研究了一下才了解,cin>>value这个语句是TRUE是FALSE,我们关心的应该是操作符>>,该操作符返回的是cin输入流!这也是为什么cin<<a;cin<<b;可以合为cin<<a<<b;所以上述一直为TRUE。
相关知识:
输入原理:
- 程序的输入都建有一个缓冲区,即输入缓冲区。
- 一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。
- 正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入
cin>>:
-
该操作符是根据后面变量的类型读取数据。
-
输入结束条件 :遇到Enter、Space、Tab键。
-
当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符
-
若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
循环的判断问题解决了,那么ctrl+z到底是什么快捷键呢???
我一开始认为这类似于正常输入的撤销键,比如我输入了1,用了撤销后,1就撤回了,但是我在控制台试了试,并不行。
那么这是如何退出循环的呢?
顺着逻辑思考,正常输入是一定一直循环的
打破了循环说明条件不满足了
那么就是输入流出现了问题
检查了细节察觉,value的类型为int,也就是说,如果我输入了其他类型的都会退出循环!
测试了一次果真如此,输入a敲回车,循环退出,输出正确结果!!!
后来查阅了一下,原来这个Ctrl+z也确实有指定的含义:
Ctrl+Z表示一个字符
- 被标记为eof,即END OF FILE
- 其ASCII码为26
- 只有当Ctrl+Z单独位于一行的行首时,才表示输入的终止
更多推荐


所有评论(0)