从一段代码开始:
int main() {int a, b;cin >> a >> b;
}
首先阻塞在 cin >> a >> b
中,等待用户输入,用户可以一直输入,直到输入了回车,这时一个以 \n
· 结尾的字符串就会输入到cin
的 character 队列中,cin >> a >> b
会让 cin
从左到右遍历,直到遇到一个空格或回车,然后截取并判断空格之前的字符是否可以转为 int
类型,如果可以,则赋值给 a
变量。如果不可以,比如是一个字符 q
或者 double
类型 3.14
,此时 cin
会指向一个 NULL
,防止进一步从 character 队列中获取读取字符,此时 if (cin)
会判为 false
,while (cin)
也会跳出循环。
如上图所示,当输入回车 \n
后,所有之前输入的字符串12 23 45 qw \n
都会进入 cin
的 character 队列,然后 cin 开始从左往右读取,遇到第一个空格后,得到 12,是一个 int 类型,于是可以赋值给 a 变量,此时 cin 会忽略空格,获取下一个非空格和回车的字符,比如 23,是一个 int 类型,于是继续赋值给 b 变量。如果 12 后面的不是 23,而是一个字母 b,如下所示,则 cin 将指向 NULL,从而阻止继续从 character 队列中读取字符。
如果要让 cin 继续可用,可以调用 cin.clear()
,cin 将从上次失败的位置继续按需读取字符,如下所示: