原文链接:原文链接
声明:
- 本文旨在方便了解学习C++语法,切勿用于任何商业用途。
- 由于本人英语水平有限,文章中可能存在语义错误,如有疑问请参照原文,也可以在评论区指出错误。
1.5 — iostream 简介:cout、cin 和 endl
在本课中,我们将更多地讨论 std::cout
,我们在 Hello world!
中使用了它!程序输出文本Hello world!
到控制台。我们还将探索如何从用户那里获取输入,我们将使用它来使我们的程序更具交互性。
输入/输出库
输入/输出库(io 库)是处理基本输入和输出的 C++ 标准库的一部分。我们将使用这个库中的功能从键盘获取输入并将数据输出到控制台。iostream
的io部分代表input/output
。
要使用iostream
库中定义的功能,我们需要在使用 iostream
中定义的内容的任何代码文件的顶部包含iostream
标头,如下所示:
#include <iostream>
// rest of code that uses iostream functionality here
std::cout
iostream
库包含一些预定义的变量供我们使用。其中最有用的是std::cout
,它允许我们将数据发送到控制台以打印为文本。cout
代表“character output”
。
提醒一下,这是我们的Hello world
程序:
#include <iostream> // for std::cout
int main()
{
std::cout << "Hello world!"; // print Hello world! to console
return 0;
}
在这个程序中,我们包含了iostream
以便我们可以访问std::cout
。在我们的main
函数中,我们使用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
相关内容
我们在第 2.9 课——命名冲突和命名空间介绍中讨论了std::前缀的实际作用。
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
代表 “end line”
。
例如:
#include <iostream> // for std::cout and std::endl
int main()
{
std::cout << "Hi!" << std::endl; // std::endl will cause the cursor to move to the next line of the console
std::cout << "My name is Alex." << std::endl;
return 0;
}
这打印:
Hi!
My name is Alex.
小费
在上述程序中,第二个std::endl在技术上不是必需的,因为程序随后立即结束。但是,它有一些有用的用途。
首先,它有助于表明输出行是一个“完整的想法”(与在代码中稍后某处完成的部分输出相反)。从这个意义上说,它的功能类似于在标准英语中使用句号。
其次,它将光标定位在下一行,这样如果我们稍后添加额外的输出行(例如让程序说“再见!”),这些行将出现在我们期望的位置(而不是附加到前一行输出)。
第三,从命令行运行可执行文件后,某些操作系统在再次显示命令提示符之前不会输出新行。如果我们的程序没有以光标在新行结束,命令提示符可能会出现在输出的前一行,而不是像用户期望的那样在新行的开头。
最佳实践
只要一行输出完成,就输出一个换行符。
std::endl 与 ‘\n’
使用 std::endl
可能有点低效,因为它实际上做了两项工作:它将光标移动到下一行,并确保输出立即显示在屏幕上(这称为刷新输出)。当使用 std::cout
将文本写入控制台时,std::cout
经常会刷新输出(如果不刷新,通常没关系),因此让 std::endl
执行刷新并不重要。
因此,通常首选使用 '\n'
字符。'\n'
字符将光标移动到下一行,但不请求刷新,因此在不会发生刷新的情况下它会执行得更好。'\n'
字符也更容易阅读,因为它更短并且可以嵌入到现有文本中。
这是一个以两种不同方式使用 '\n'
的示例:
#include <iostream> // for std::cout
int main()
{
int x{ 5 };
std::cout << "x is equal to: " << x << '\n'; // Using '\n' standalone
std::cout << "And that's all, folks!\n"; // Using '\n' embedded into a double-quoted piece of text (note: no single quotes when used this way)
return 0;
}
这打印:
x is equal to: 5
And that's all, folks!
请注意,当单独使用 '\n'
将光标移动到下一行时,需要使用单引号。当嵌入到已经双引号的文本中时,不需要单引号。
当我们进入关于 chars 的课程(4.11 -- Chars)
时,我们将更详细地介绍 '\n'
是什么。
最佳实践
将文本输出到控制台时,首选 '\n' 而不是 std::endl。
警告
'\n' 使用反斜杠(与 C++ 中的所有特殊字符一样),而不是正斜杠。使用正斜杠(例如“/n”)可能会导致意外行为。
std::cin
std::cin
是 iostream
库中定义的另一个预定义变量。 std::cout
使用插入运算符 (<<
) 将数据打印到控制台,而 std::cin
(代表“character input”)使用提取运算符 (>>
) 从键盘读取输入。输入必须存储在要使用的变量中。
#include <iostream> // for std::cout and std::cin
int main()
{
std::cout << "Enter a number: "; // ask user for a number
int x{ }; // define variable x to hold user input (and zero-initialize it)
std::cin >> x; // get number from keyboard and store it in variable x
std::cout << "You entered " << x << '\n';
return 0;
}
尝试编译这个程序并自己运行它。运行程序时,第 5 行将打印“输入数字:”。当代码到达第 8 行时,您的程序将等待您输入输入。一旦你输入一个数字(并按下回车键),你输入的数字将被分配给变量x。最后,在第 10 行,程序将打印“您输入”,然后是您刚刚输入的数字。
例如(我输入了 4):
Enter a number: 4
You entered 4
这是从用户那里获取键盘输入的一种简单方法,我们将在以后的许多示例中使用它。请注意,在接受输入时您不需要使用 '\n'
,因为用户需要按enter
键才能接受他们的输入,这会将光标移动到下一行。
就像可以在一行中输出多个文本一样,也可以在一行中输入多个值:
#include <iostream> // for std::cout and std::cin
int main()
{
std::cout << "Enter two numbers separated by a space: ";
int x{ }; // define variable x to hold user input (and zero-initialize it)
int y{ }; // define variable y to hold user input (and zero-initialize it)
std::cin >> x >> y; // get two numbers and store in variable x and y respectively
std::cout << "You entered " << x << " and " << y << '\n';
return 0;
}
这将产生输出:
Enter two numbers separated by a space: 5 6
You entered 5 and 6
最佳实践
关于是否有必要在通过另一个源(例如std::cin)给它一个用户提供的值之前立即初始化一个变量存在一些争论,因为用户提供的值只会覆盖初始化值。根据我们之前建议始终初始化变量的建议,最佳实践是首先初始化变量。
我们将在以后的课程中讨论std::cin
如何处理无效输入( 7.16 – std::cin 和处理无效输入)。
对于高级读者
C++ I/O 库不提供一种无需用户按enter即可接受键盘输入的方法。如果这是您想要的,您将不得不使用第三方库。对于控制台应用程序,我们推荐pdcurses、FXTUI或cpp-terminal。许多图形用户库都有自己的功能来做这种事情。
概括
新程序员经常混淆 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
我们将在第1.9课 - 文字和运算符简介中更多地讨论运算符。