
1.3 玩转输入输出
标准输入输出流的对象和操作方法都是由istream和ostream两个类提供的,这两个类继承自ios基类,它们预定义了标准输入输出流对象,并且提供了多种形式的输入输出功能。C++在进行输入时需要从流中提取数据,在输出时需要向流中插入数据,提取和插入是通过在流类库中重载“>>”和“<<”运算符实现的。
1. cin
cin是istream类的对象,用于处理标准输入(即键盘输入);cout是ostream类的对象,用于处理标准输出(即屏幕输出)。cin与提取运算符“>>”结合使用,cout与插入运算符“<<”结合使用,完成了C++中的输入输出操作。
cin从标准输入设备(键盘)中获取数据,通过提取运算符“>>”从流中提取数据,然后发送给cin对象,由cin对象将数据发送到指定的地方。cin是带缓冲区的输入流对象,只有在输入完数据并按下回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。例如:

此时若从键盘上输入10,则10只是被存入缓冲区,并不能被“>>”运算符提取,按下回车键后,缓冲区中的内容才被刷新成输入流,被“>>”运算符提取后传递给cin对象,由cin对象发送到变量a中存储。
从流中读取数据要保证能正常进行。例如,如果针对以上代码,从键盘上输入字符串“abc”,则进行提取操作会失败,此时cin流被置为出错状态,因为变量a是int类型。只有在正常状态时才能从输入流中提取数据,这也是C++ I/O的安全性体现。
除了单个变量读取,cin对象也可以一次性读入多个变量的值,因为“>>”运算符返回的是istream的引用,所以可连续提取数据。例如:

若从键盘输入1 2,上面的cin语句就会把输入的1发送给变量a,把输入的2发送给变量b。当输入多个数值时,要在数值之间加空格以示区分,cin读到空格时,就能够区分输入的各个数值。除了在输入的数据之间加空格,也可以在每输入一个数据后都按回车键或Tab键,这样就可以正确地读入数据了。
也可以采用cin对象一次性读入多个不同类型的变量值。例如:

当从键盘正确输入字符串和float类型的值时,cin会将它们分别存储到对应变量中。
读入字符串后,也可以采用字符数组存储字符串。例如:

如果用一个字符数组存储字符串,则要确保输入的字符串不超出字符数组的大小,否则会发生溢出,破坏内存中的其他数据。
2. cout
cout是ostream类的对象,对应的标准设备为屏幕,叫作标准输出对象或屏幕输出对象,但也可被重定向输出到磁盘文件。用户可以通过cout对象调用ostream类的插入运算符和成员函数来输出信息。
(1)利用cout对象可以直接输出常量值。在输出常量值时,直接将要输出的内容放在“<<”运算符后面即可。例如:

(2)利用cout对象输出变量的值。在用cout输出变量值时,不必设置以什么格式输出,“<<”运算符会根据变量的数据类型自动调用相匹配的重载函数来正确输出,这比C语言中的printf()函数的用法更简便。例如:

(3)利用cout对象输出指针、引用类型的数据。当输出数据为指针或引用类型时,与printf()函数的用法一致,不带“*”符号输出的是指针的值,即变量的地址;带“*”符号输出的是指针指向的变量的值。它比printf()函数简便之处在于不必设置数据的输出格式。例如:

(4)cout对象可以连续输出数据。例如:

训练1-1:输入圆的半径r,输出其周长和面积。

3. 浮点数精度、域宽、填充
对于浮点数,可以设置精度,控制输出的位数;也可以设置域宽,控制输出占多少位;还可以用字符填充,如下表所示。进行这些操作时需要引入头文件#include <iomanip>。

训练1-2:将2.0开平方后设置不同的精度和宽度输出。

4. 输出格式
在输出时,可以控制输出的进制和换行,如下表所示。

在输出时,还可以控制左右对齐、科学记数法等,如下表所示。

5. 常用的运算符
常用的运算符及其作用如下表所示。

(1)常用的算术运算符及其运算、范例、结果如下表所示。

训练1-3:输入一个三位数,输出其个位、十位、百位上的数字。

(2)常用的赋值运算符及其运算、范例、结果如下表所示。

(3)常用的关系运算符及其运算、范例、结果如下表所示。关系运算符用于对两个数值或变量进行比较,其结果是一个逻辑值(“真”或“假”)。

(4)常用的逻辑运算符及其运算、范例、结果如下表所示。逻辑运算符用于判断数据的真假,其结果为“真”或“假”。

注意:千万不要将“==”运算符写成赋值运算符“=”。例如,不能将if(a==b)写成if(a=b),虽然系统不会有错误提示,却存在逻辑错误。
优先级如下:
• “&&”优先级高于“||”;
• “&&”“||”优先级低于关系运算;
• “!”优先级高于所有关系运算和算术运算。
训练1-4:输入3个整数,分别输出其增加1、扩大10倍、缩小10倍的结果。
