在本课中,我们将更多地讨论 std::cout,我们在Hello world!中使用了它。程序输出文本Hello world! 到控制台。我们还将探索如何获取用户的输入来使程序更具交互性。
输入/输出库
输入/输出库(io 库)是处理基本输入和输出的 C++ 标准库的一部分。我们将使用此库中的功能从键盘获取输入并将数据输出到控制台。iostream的 io部分代表输入/输出。
要使用iostream库中定义的功能,我们需要在使用iostream中定义的内容的任何代码文件的顶部包含iostream标头,如下所示:
#include <iostream>
// rest of code that uses iostream functionality here
std::cout
iostream库包含一些预定义的变量供我们使用。最有用的之一是std::cout,它允许我们将数据发送到控制台以作为文本打印。cout代表“字符输出”。
以下是我们的Hello world程序:
#include <iostream> // for std::cout
int main()
{
std::cout << "Hello world!"; // print Hello world! to console
return 0;
}
在此程序中,我们包含了iostream,以便我们可以访问std::cout。在我们的主函数中,我们使用std::cout以及插入运算符 ( <<
)来发送文本Hello world! 输出到控制台。
std::cout不仅可以打印文本,还可以打印数字:
#include <iostream> // for std::cout
int main()
{
std::cout << 4; // print 4 to console
return 0;
}
输出:
4
还可以用于打印变量的值:
#include <iostream> // for std::cout
int main()
{
int x{ 5 }; // define integer variable x, initialized with value 5
std::cout << x; // print value of x (5) to console
return 0;
}
输出:
5
要在同一行上打印多个内容,<<
可以在单个语句中多次使用插入运算符 ( ) 以连接(链接在一起)多个输出。例如:
#include <iostream> // for std::cout
int main()
{
std::cout << "Hello" << " world!";
return 0;
}
输出:
Hello world!
这是另一个示例,我们在同一语句中打印文本和变量的值:
#include <iostream> // for std::cout
int main()
{
int x{ 5 };
std::cout << "x is equal to: " << x;
return 0;
}
输出:
x is equal to: 5
std::endl
#include <iostream> // for std::cout
int main()
{
std::cout << "Hi!";
std::cout << "My name is Alex.";
return 0;
}
输出:
Hi!My name is Alex.
单独的输出语句不会导致控制台上出现单独的输出行。
如果我们想将单独的输出行打印到控制台,我们需要告诉控制台何时将光标移动到下一行。
一种方法是使用std::endl。当使用std::cout输出时,std::endl将换行符打印到控制台(导致光标转到下一行的开头)。在这种情况下,endl代表“结束线”。
例如:
#include <iostream> // for std::cout and std::endl
int main()
{
std::cout << "Hi!" << std::endl; // std::endl 将使光标移动到控制台的下一行
std::cout << "My name is Alex." << std::endl;
return 0;
}
输出:
Hi!
My name is Alex.
在上面的程序中,第二个std::endl在技术上不是必需的,因为程序随后立即结束。然而,它有一些有用的目的。
首先,它有助于表明输出行是一个“完整的想法”(而不是在代码后面的某个地方完成的部分输出)。从这个意义上说,它的功能类似于标准英语中使用句号。
其次,它将光标定位在下一行,这样如果我们稍后添加额外的输出行(例如让程序说“再见!”),这些行将出现在我们期望的位置(而不是附加到输出的前一行) )。
第三,从命令行运行可执行文件后,某些操作系统在再次显示命令提示符之前不会输出新行。如果我们的程序没有以光标在新行上结束,则命令提示符可能会附加到输出的前一行,而不是像用户期望的那样出现在新行的开头。
每当一行输出完成时,输出换行符。
std::cout 已缓冲
想象在您最喜欢的游乐园乘坐过山车。乘客出现(以某种不同的速度)并排队。火车定期抵达并登上乘客(最多可容纳火车的最大载客量)。当火车满员或经过足够的时间后,火车载着一批乘客出发,旅程开始。无法登上当前列车的乘客将等待下一趟列车。
这个类比类似于 C++ 中发送到 std::cout 的输出的典型处理方式。我们程序中的语句请求将输出发送到控制台。但是,该输出通常不会立即发送到控制台。相反,请求的输出“排队”,并存储在专门用于收集此类请求的内存区域(称为缓冲区)中。缓冲区会定期刷新,这意味着缓冲区中收集的所有数据都会传输到其目的地(在本例中为控制台)。
这也意味着,如果您的程序在刷新缓冲区之前崩溃、中止或暂停(例如出于调试目的),则不会显示仍在缓冲区中等待的任何输出。
缓冲输出的反面是无缓冲输出。对于无缓冲输出,每个单独的输出请求都直接发送到输出设备。将数据写入缓冲区通常速度很快,而将一批数据传输到输出设备则相对较慢。
缓冲可以通过最大限度地减少存在多个输出请求时需要执行的慢速传输的数量来显着提高性能。
std::endl 与 ‘\n’
使用 std::endl 可能有点低效,因为它实际上执行两项工作:将光标移动到控制台的下一行,并刷新缓冲区。将文本写入控制台时,我们通常不需要刷新每行末尾的缓冲区。让系统定期刷新自己会更有效(它的设计目的是有效地执行此操作)。
因此,通常首选使用“\n”字符。’\n’ 字符将光标移动到控制台的下一行,但不请求刷新,因此它通常会执行得更好。’\n’ 字符也更简洁,因为它更短并且可以嵌入到现有文本中。
下面是一个以两种不同方式使用 ‘\n’ 的示例:
#include <iostream> // for std::cout
int main()
{
int x{ 5 };
std::cout << "x is equal to: " << x << '\n'; // 独立使用“\n”
std::cout << "And that's all, folks!\n"; // 使用嵌入双引号文本的 '\n' (注意:以这种方式使用时没有单引号)
return 0;
}
输出:
x is equal to: 5
And that's all, folks!
当’\n’单独使用将光标移动到控制台的下一行时,应该用单引号引起来。当嵌入到已经用双引号引起来的文本中时,不需要额外的引号。
将文本输出到控制台时,优先使用 ‘\n’ 而不是 std::endl。
‘\n’ 使用反斜杠(C++ 中的所有特殊字符也是如此),而不是正斜杠。使用正斜杠(例如“/n”)可能会导致意外行为。
std::cin
std::cin
是库中定义的另一个预定义变量iostream
。使用插入运算符 ( ) 将数据打印到控制台(代表“字符输入”),使用std::cout
提取运算符 ( )从键盘读取输入。输入必须存储在要使用的变量中。<<std::cin
>>
#include <iostream> // 用于 std::cout 和 std::cin
int main()
{
std::cout << "请输入一个数字:"; // 向用户询问一个数字
int x{ }; // 定义变量 x 以保存用户输入(并进行零初始化)
std::cin >> x; // 从键盘获取数字并将其存储在变量 x 中
std::cout << "您输入了 " << x << '\n';
return 0;
}
尝试自己编译该程序并运行它。运行程序时,第 5 行将打印“请输入一个数字:”。当代码到达第 8 行时,你的程序将等待你输入。输入数字(并按 Enter 键)后,您输入的数字将分配给变量x。最后,在第 10 行,程序将打印“您输入了”,后跟您刚刚输入的数字。
例如(我输入了4):
请输入一个数字:4
您输入了 4
这是从用户获取键盘输入的简单方法,我们将在以后的许多示例中使用它。请注意,接受输入时不需要使用“\n”,因为用户需要按 Enter键才能接受输入,这会将光标移动到控制台的下一行。
如果您的屏幕在输入数字后立即关闭,请参阅一些常见的 C++ 问题的解决方案。
就像可以在一行中输出多于一位文本一样,也可以在一行中输入多个值:
#include <iostream> // 用于 std::cout 和 std::cin
int main()
{
std::cout << "输入两个数字,以空格分隔:";
int x{ }; // 定义变量 x 以保存用户输入(并进行零初始化)
int y{ }; // 定义变量 y 以保存用户输入(并进行零初始化)
std::cin >> x >> y; // 获取两个数字并分别存储在变量 x 和 y 中
std::cout << "您输入了 " << x << " 和 " << y << '\n';
return 0;
}
输出:
输入两个数字,以空格分隔:5 6
您输入了 5 和 6
关于是否有必要在通过另一个源(例如 std::cin)向变量提供用户提供的值之前立即初始化变量存在一些争论,因为用户提供的值只会覆盖初始化值。根据我们之前关于变量应始终初始化的建议,最佳实践是首先初始化变量。
C++ I/O 库不提供无需用户按Enter即可接受键盘输入的方法。如果这是您想要的,则必须使用第三方库。对于控制台应用程序,我们建议使用pdcurses、FXTUI、cpp-terminal或notcurses。许多图形用户界面库都有自己的函数来完成这种事情。
概括
新程序员经常混淆 std::cin、std::cout、插入运算符 ( <<
) 和提取运算符 ( >>
)。这是一个容易记住的方法:
std::cin
并std::cout
始终位于声明的左侧。std::cout
用于输出一个值(cout=字符输出)std::cin
用于获取输入值(cin = 字符输入)<<
与 std::cout 一起使用,显示数据移动的方向(如果std::cout
代表控制台,则输出数据从变量移动到控制台)。std::cout << 4
将值 4 移至控制台>>
与 一起使用std::cin
,显示数据移动的方向(如果 std::cin 代表键盘,则输入数据从键盘移动到变量)。std::cin >> x
将用户从键盘输入的值移至 x
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/introduction-to-iostream-cout-cin-and-endl/