1.2 看看输入输出是怎么实现的 A First Look at Input/Output
C++没有直接定义用来输入输出(IO)的语句,IO是由标准库(standard library)提供的。我们要用的是iostream库,它是处理格式化的输入输出的(对于“格式化的formatted”的
意思不理解)。
iostream库的基础是istream类和ostream类,它们分别代表了输入流和输出流。“流stream”就是一连串要发送给IO设备或从IO设备读取的字符。
1.2.1 有哪些标准输入输出对象
iostream库定义了4个对象:cin,读作“see-in”,处理输入,这是一个istream类的对象。cout,读作“see-out”,处理输出;cerr,读作“see-err”,用来产生警告或错误
信息;clog ,读作“see-log”,用来产生程序执行的信息,这三个是ostream类的对象。
默认情况下,操作系统会把这些命令和执行程序的窗口连在一起。也就是说,当我们从cin(注意cin是一个istream的对象,不是一条命令)读时,我们是从执行程序的窗口读(也就
是说窗口和cin是同一个对象);当我们用cout,cerr,clog输出时,也是往执行程序的窗口输出(这时cout,cerr,clog分别和窗口连在了一起)。大多数操作系统都提供了重定向
输入输出流的方法,用这些方法我们可以把流连接到文件或其它地方(还能有哪些地方呢?比如说打印机?)。
1.2.2 来看一个用到IO库的程序
一开始提到的书店问题中,对于有相同ISBN的交易记录,我们要计算总的销售数量。下面我们就看看怎么把两个数相加。
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1, v2;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
执行这个程序时,窗口中首先打印出 Enter two numbers: 并等等待用户的输入。如果我们输入3 7然后回车,程序就很输出这样的运行结果:The sum of 3 and 7 is 10。
程序的第一行#include <iostream>是一个预处理指令preprocessor directive,它告诉编译器我们要用iostream库。iostream是一个头文件,我们要用某个库时必须包含相关的
头文件。像#include <iostream>这样的包含头文件的声明必须写在同一行,而且应该放在程序文件的开头,所有函数之外。
向流中写入
std::cout << "Enter two numbers:" << std::endl;
这是一个表达式,用来向标准输出cout中写入提示信息。C++的表达式由一个或两个操作数和一个操作符组成,上面的语句中用到了输出操作符“<<”(可以把这个操作符理解为“
流的方向”,也就是说上面的语句表示"Enter two numbers:"这个字符串流向了std::cout)。输出操作符需要两个操作数,左面的应该是一个ostream对象,右面的是要输出的值
。
C++中每个表达式都有返回值,“<<”的返回值是它的左操作数,也就是ostream对象。因此我们可以像上面那么连续地使用“<<”,因为std::cout << "Enter two numbers:" 返
回了std::cout,我们就可以继续写<< std::endl。
endl是一个特殊值,叫做操作符manipulator,把endl写入输出流时有换行的效果,并且会刷新与设备相关联的缓冲区buffer,使缓冲区中的内容全部显示出来。
使用标准库中的名字
因为cout、endl都是标准库中定义的对象,而标准库的对象名都定义在命名空间std中,因此我们使用时写成std::cout、std::endl以便明确指出我们要用的是std中定义的cout、
end;。这样我们也可以自己给cout、endl定义新的作用,而不会冲突。比如我们可以把cout当成一个变量名,int cout=1;然后输出std::cout<<cout;,系统就能分辨出std::cout
是调用标准输出对象,而<<后面的cout是我们自己定义的一个变量。
#include<iostream>
int main(){
int cout=1;
std::cout<<cout<<std::endl;
return 0;
}
从流中读入
首先定义两个变量
int v1, v2;
我们把两个变量v1、v2定义成int类型,这是一个内置类型,表示整型。这两个变量是没有初始化的uninitialized,就是说我们没有给它们一个初始值。因为我们第一次使用它们
时就是给它们读入分别读入一个值,所以一开始没有初始化也是可以的。
读入两个值:
std::cin >> v1 >> v2;
输入操作符“>>”和输出操作符“<<”类似:左面是istream对象,右面是一个变量,保存从cin读入的值;返回值是左操作数,即cin,所有可以把几个输入操作合并在一起。
下面一条语句输出结果:
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
输出的操作数中既有字符串常量string literals,比如"The sum of "(注意of后面有空格,另外" and "中也有两个空格),又有整型值,比如v1、v2,还有算术表达式的计算结
果v1+v2。各种内置数据类型都可以用iostream库来输入输出。
在C++中,很多地方的空格可以用换行符代替,但字符串常量中的空格不行,预处理指令中也不行。
关键概念:变量初始化
变量初始化是C++中一个很重要的概念。变量初始化就是定义变量时给它一个初始值,如:int val1=0。如果能保证第一次使用这个变量时就是给它赋值,那么定义时不初始化也
可以,如果不能保证,那最好定义变量时就初始化。