1.6 数据输入和输出

C++的输入、输出操作由I/O流库提供。cin和cout是流库预定义的两个标准对象,分别连接键盘和屏幕,它们在头文件iostream中说明。这里仅介绍最简单的键盘输入和屏幕输出功能,参见第11章。

1.6.1 键盘输入

键盘输入的作用是读取用户输入的字符串,按相应变量的类型转换成二进制代码写入内存。

键盘输入语句格式为:

            cin>> 变量 1>> 变量 2 … >> 变量 n;

其中,cin是预定义输入流对象;>>在流操作中称为提取运算符。

所有变量都必须是已经说明的基本类型存储单元。

程序运行,执行到输入语句后,等待用户按语句指定的变量顺序和类型输入各变量的值。输入的各数据用空格或换行符分隔。例如:

            double x, y, *p = &y;
            cin >> x >> *p;

从键盘上输入:

            34.5  7.96

cin提取操作从键盘获取字符串"34.5"和"7.96",按变量说明的类型转换成浮点型数据后写入变量x和y中。

还可以用换行符分隔,输入:

            34.5
            7.96

输入时,编译程序读到非算术型数据的字符,作为一个数据项的结束。但是,如果要求输入字符类型数据,对于不同版本的C++,情况有所不同。在VC.NET中,编译器按数值输入的方式处理,用空格或换行符分隔,也可以连续输入字符。cin不接受空格或换行符的键盘输入。

如果有: cin >> x+y;

将出现编译错误。请读者想一想为什么?

1.6.2 屏幕输出

屏幕输出的作用是从内存读取数据项,并对表达式求值,转换成相应的字符串显示到屏幕上。

屏幕输出语句格式为:

            cout<< 表达式 1<< 表达式 2 … << 表达式 n;

其中,cout是预定义输出流对象;<<在流操作中称为插入运算符;表达式1~表达式n是输出项。

cout的插入操作首先对各输出项的表达式求值,然后转换成字符串形式输出。

提取符“>>”和插入符“<<”是I/O流重载的运算符,重载运算符可以改变语义,但不能改变优先级。当输出项表达式中的运算符优先级高于插入符时,cout能够正确地先计算值后输出;反之,就会出编译错误。

例如,以下语句出错,因为赋值符和条件运算的优先级都低于插入运算符:

            cout<<a=b;               //错误
            cout<<a>b?a:b;           //错误

可以添加括号改变优先级:

            cout<<(a=b);            //正确
            cout<<(a>b?a:b);        //正确

输出项可以包含各种控制格式的符号或函数。例如,制表符'\t',换行符'\n' 等特殊控制字符可以直接嵌入字符串输出项中。I/O 流还提供了一批数据输出格式控制符,它们作为独立输出项目使用。详见第11章。表1.6列出几个常用的输出格式控制符。使用格式控制符要包含头文件iomanip。

表1.6 常用输出格式控制符

例如,以下3条语句输出格式都一样:

            cout << "Hello!\nI am ZhangHua.\n";
            cout << "Hello!"<<'\n' << "I am ZhangHua." << '\n';
            cout << "Hello!" << endl << "I am ZhangHua." << endl;

又如,输出浮点数7.5612,设置输出宽度为10,输出精度为4(小数点后保留3位有效数字),输出后换行,语句为:

            cout << setw(10) << setprecision(4)<<7.5612 << endl;

【例1-14】用不同数制输出两个正整数的和。

            #include <iostream>
            #include<iomanip>                       //包含格式输出文件
            using namespace std;
            int main()
            {  int a,b,s;                           //说明数据
              cout.setf(ios::showbase);             //要求输出显示控制符
              a=01137;  b=023362;  s=a+b;           //计算两个八进制数的和
              cout<<"八进制数";
              cout<<oct<<a<<"+"<<b<<"="<<s<<endl;   //以八进制数显示结果
              a=239;  b=5618;  s=a+b;               //计算两个十进制数的和
              cout<<"十进制数";                     //以十进制数显示结果
              cout<<dec<<a<<"+"<<b<<"="<<s<<endl;
              a=0x1a3e;  b=0x4bf;  s=a+b;           //计算两个十六进制数的和
              cout<<"十六进制数";
              cout<<hex<<a<<"+"<<b<<"="<<s<<endl;   //以十六进制数显示结果
            }

程序运行结果:

            八进制数     01137+023362=024521
            十进制数     239+5618=5857
            十六进制数   0x1a3e+0x4bf=0x1efd

1.6.3 表达式语句

任何表达式加上一个分号就成了语句,称为表达式语句。例如:

            a=10    //赋值表达式
            a=10;   //赋值语句
            i++     //算术表达式
            i++;    //算术表达式语句

又如: x-y;

也是一个合法的C++语句,执行x-y的操作,但没有把结果存放在任何地方,是一个没有意义的语句。

可以用{ }把一些语句括起来,称为复合语句或语句块。例如:

            { t = a; a = b; b = t; }

只有一个分号也是语句,称为空语句,例如:

            ;

输入/输出语句、表达式语句都是对数据进行操作的语句,它们在程序中按出现顺序执行。