辛是如何工作的?
How does cin work?
我运行这个代码
char c;
cin >> c;
cout << c;
cin >> c;
cout << c;
并写入控制台 ab
,按回车键。所以我在下一行得到了 ab
。但我不明白它是如何工作的。在按下 enter 之前,程序不会读取任何内容,对吗?按下后,它读取 a
,将其保存到 char c
,然后读取 char c
,将 a
写入控制台。没关系。但是它怎么能读到 b
在第二行呢?第二行
不是b
基本上,cin
有一个数据类型 char
的重载,只从输入流中抓取 1 个字符,所以你的程序基本上是这样的:
char c;
cin >> c; // reads 'a' from the input stream (input stream contains 'ab\n')
cout << c; // prints 'a'
cin >> c; // changes c to 'b' (reads 'b')
cout << c; // prints 'b'
cin 和 cout 是缓冲流。当您按回车键时,'a' 和 'b' 都会进入输入缓冲区。 '>>' 运算符从该缓冲区读取(在您的情况下一次一个字符)。 '<<' 写入输出缓冲区。唯一让您感到惊讶的是,您在输出中看到 "ab" 而没有打印“\n”(后一个符号应该将输出缓冲区的内容刷新到终端)。
简而言之,两者cin 和 cout 是缓冲区。输入和输出运算符使用这些缓冲区。换行符号启动从实际输入到输入缓冲区以及从输出缓冲区到实际输出的数据传输。
关于I/O的更多信息你可以学习。
cin 是一个被阻止的输入。来自键盘的任何内容都存储在缓冲区中。当您按下回车键时,系统会将缓冲区传递给应用程序代码(std::cin 代码)。运算符 >> 将决定从该缓冲区读取多少 - 一个字符、字符串、整数、浮点数等。取决于操作数的类型。
cin
是标准输入 stream。流媒体的本质对于深入理解 C++ 至关重要 I/O.
默认情况下,cin >> x
意味着:
From the point currently in the stream, skip any whitespace which might be there and then keep reading as long as possible & necessary to get a valid representation of x
.
让我们暂时忽略输入来自键盘的事实。开始时流的内容是a b LINEFEED
。您执行 cin >> c
,这将从输入中读取第一个字符 a
。这足以填写 c
,因此阅读停止。 cin
流现在包含 b LINEFEED
。然后将变量 c
写入标准输出。
接下来是另一个 cin >> c
,所以又读了一个字符(这次是 b
)。同样,一个字符就足够了,所以读取结束,流内容只是LINEFEED
。 b
然后被发送到标准输出流。
标准输入和标准输出流通常绑定到控制台这一事实不会以任何方式影响它们的内部工作。 cin
没有 "forget" 里面的内容只是因为同时一些输出出现在屏幕上。特别是,cin
读取 键盘, 而不是 "characters on the console." 碰巧按键既在控制台上回显它们又将它们馈送到 cin
.
因此您的程序同时输出字符 a
对 cin
流的内容没有影响。
我运行这个代码
char c;
cin >> c;
cout << c;
cin >> c;
cout << c;
并写入控制台 ab
,按回车键。所以我在下一行得到了 ab
。但我不明白它是如何工作的。在按下 enter 之前,程序不会读取任何内容,对吗?按下后,它读取 a
,将其保存到 char c
,然后读取 char c
,将 a
写入控制台。没关系。但是它怎么能读到 b
在第二行呢?第二行
b
基本上,cin
有一个数据类型 char
的重载,只从输入流中抓取 1 个字符,所以你的程序基本上是这样的:
char c;
cin >> c; // reads 'a' from the input stream (input stream contains 'ab\n')
cout << c; // prints 'a'
cin >> c; // changes c to 'b' (reads 'b')
cout << c; // prints 'b'
cin 和 cout 是缓冲流。当您按回车键时,'a' 和 'b' 都会进入输入缓冲区。 '>>' 运算符从该缓冲区读取(在您的情况下一次一个字符)。 '<<' 写入输出缓冲区。唯一让您感到惊讶的是,您在输出中看到 "ab" 而没有打印“\n”(后一个符号应该将输出缓冲区的内容刷新到终端)。
简而言之,两者cin 和 cout 是缓冲区。输入和输出运算符使用这些缓冲区。换行符号启动从实际输入到输入缓冲区以及从输出缓冲区到实际输出的数据传输。
关于I/O的更多信息你可以学习。
cin 是一个被阻止的输入。来自键盘的任何内容都存储在缓冲区中。当您按下回车键时,系统会将缓冲区传递给应用程序代码(std::cin 代码)。运算符 >> 将决定从该缓冲区读取多少 - 一个字符、字符串、整数、浮点数等。取决于操作数的类型。
cin
是标准输入 stream。流媒体的本质对于深入理解 C++ 至关重要 I/O.
默认情况下,cin >> x
意味着:
From the point currently in the stream, skip any whitespace which might be there and then keep reading as long as possible & necessary to get a valid representation of
x
.
让我们暂时忽略输入来自键盘的事实。开始时流的内容是a b LINEFEED
。您执行 cin >> c
,这将从输入中读取第一个字符 a
。这足以填写 c
,因此阅读停止。 cin
流现在包含 b LINEFEED
。然后将变量 c
写入标准输出。
接下来是另一个 cin >> c
,所以又读了一个字符(这次是 b
)。同样,一个字符就足够了,所以读取结束,流内容只是LINEFEED
。 b
然后被发送到标准输出流。
标准输入和标准输出流通常绑定到控制台这一事实不会以任何方式影响它们的内部工作。 cin
没有 "forget" 里面的内容只是因为同时一些输出出现在屏幕上。特别是,cin
读取 键盘, 而不是 "characters on the console." 碰巧按键既在控制台上回显它们又将它们馈送到 cin
.
因此您的程序同时输出字符 a
对 cin
流的内容没有影响。