看到了这样的一段代码:

#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单独位于一行的行首时,才表示输入的终止

更多推荐