程序运行中,有时候需要从外部设备(例如键盘)上得到一些原始数据,而程序计算结束后,通常要把计算结果发送到外部设备(例如显示器)上以便人们对结果进行分析。我们把程序从外部设备上获得数据的操作称为“输入”,而把程序发送数据到外部设备的操作称为“输出”。不像其他的高级语言,C语言没有专门的输入/输出语句,输入/输出的操作是通过调用C语言的库函数来实现的。printf()函数是最常用的输出函数,它的作用是向计算机系统默认的输出设备(一般指显示器)输出一个或多个任意指定类型的数据。
调用printf()函数的一般格式如下:
printf("格式字符串",输出项表);
例如:
printf("n=%3d,f=%5.1f\n,c=%c",n,f,c);
其中,“格式字符串”也称为格式控制字符串或格式转换字符串,可以包含下列三种字符:
· 格式指示符。例如“%3d”、“%5.1f”和“%c”等,这些字符用来控制数据的输出格式。
· 转义字符。这些字符通常用来控制光标的位置。
· 普通字符。除格式指示符和转义字符之外的其他字符,这些字符输出时原样输出,例如上面例子中的“n=”等。
“输出项表”由若干个输出项构成,输出项之间用逗号来分隔,每个输出项既可以是常量、变量,也可以是表达式。有时候,调用printf()函数也可以没有输出项。在这种情况下,一般用来输出一些提示信息,例如:
printf("China\n");
在C++中,cout表示标准输出流对象,用于屏幕输出,“<<”是插入符,它将后面的内容插入到cout中,即输出到屏幕上,而且不像printf()函数那样需要指定格式指示符,即“cout <<”可以输出任何类型的数据,使用起来简单方便。例如,与上述语句等同功能的cout语句如下:
cout << "China\n";
由于定义插入符“<<”等包含在头文件iostream.h中,所以在使用“cout <<”语句时应包含“#include <iostream.h>”预处理命令。
格式指示符的一般形式如下:
%[修饰符]格式字符
printf函数中常用的格式字符及其说明如表3-1所示。
表3-1 printf()函数常用的格式字符及其说明
格式字符 |
说 明 |
c |
输出一个字符 |
d或i |
输出带符号的十进制整数(正数不输出符号) |
o |
以八进制无符号形式输出整数(不输出前导符0) |
x或X |
以十六进制无符号形式输出整数(不输出前导符0x或0X)。对于0x用abcdef输出;对于0X,用ABCDEF输出 |
u |
按无符号的十进制形式输出整数 |
f |
以[-]mmm.ddd带小数点的形式输出单精度和双精度数,d的个数由精度指定。隐含的精度为6,若指定的精度为0,小数部分(包括小数点)都不输出 |
e或E |
以[-]m.dddddde±xx或[-]m.ddddddE±xx的形式输出单精度和双精度数。d的个数由精度指定,隐含的精度为6,若指定的精度为0,小数部分(包括小数点)都不输出。用E时,指数以大写“E”表示 |
g或G |
由系统决定采用%f格式还是采用%e格式,以使输出宽度最小。不输出无意义的0。用G时,若以指数形式输出,则指数以大写表示 |
s |
输出字符串中的字符,直到遇到'\0',或者输出由精度指定的字符数 |
长度修饰符“l”加在%号和格式字符之间。输出长整型数据的时候,一定要加长度修饰符,否则得不到正确的显示结果。例如:
long x=1234567;
printf("x=%lf\n",x);
输出结果为:
x=1234567
在Visual C++中,由于long和int型数据占用的字节长度均为4,这里可不用加上l或L(因为1234567在16位机环境下超出了int型数据的范围,应用长整型变量存储,而该数在32位机环境下未超过int型数据的范围)。
可以在“%”符号和格式字符之间加入形如“m.n”(m、n均为整数)的修饰。其中,m为宽度修饰,n为精度修饰。宽度修饰用来指定数据的输出宽度。精度修饰对不同的格式字符作用不同:对于格式字符f,用来指定输出小数位的位数;对于格式字符e,用来指定输出有效数字的位数;对于格式字符d,用来指定必须输出的数字的个数。其相关的例子如表3-2所示。
表3-2 宽度修饰和精度修饰示例
输出语句 |
输出结果( 表示空格) |
输出语句 |
输出结果(表示空格) |
printf("%5d\n",12); |
12 |
printf("%.2f\n",1.23456); |
1.23 |
printf("%5.3d\n",12); |
012 |
printf("%10.2e\n",1.23456); |
1.23e+000 |
printf("%.3d\n",12); |
012 |
printf("%.2E\n",1.23456); |
1.23E+000 |
printf("%7.2f\n",1.23456); |
1.23 |
|
|
在指定了宽度修饰时,如果指定宽度小于数据需要的实际宽度,则数据左边补空格,补够指定的宽度,这种对齐方式称为“右对齐”。当然,也可以在数据的右边补空格来补够指定的宽度,这种对齐方式称为“左对齐”。指定左对齐的时候,使用左对齐修饰符“-”,
例如语句:
printf("%-7.2f\n",1.23456);
输出结果为:
1.23 (右边补三个空格)
printf()函数可以输出常量、变量和表达式的值。但格式控制字符串中的格式指示符必须按从左到右的顺序与输出项表中的每个数据一一对应,否则出错。
格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包含的字母也大写。除了x、e、g格式字符外,其他格式字符必须用小写字母,例如,“%f”不能写成“%F”。
格式字符紧跟在“%”后面才作为格式字符,否则将作为普通字符使用(原样输出)。
使用printf()函数时还要注意一个问题,那就是输出项表中的求值顺序,即当printf()函数中的输出项表中有多个表达式时,先计算哪个表达式的问题。对此,不同的编译系统不一定相同。
【程序3-2】分析以下程序(在Visual C++6.0环境下)的运行结果。
/*文件名:chap03_2.cpp*/
#include <stdio.h>
void main()
{
int i=2;
printf("%d,%d,%d,%d\n",i++,++i,i,i++);
printf("%d\n",i);
}
在Visual C++ 6.0环境下程序运行结果:
3,3,2,2
5
像这种能够产生副作用的代码在实际编程过程中极少用到,这样使用也大大降低了程序的可读性,建议读者尽量不要使用。
【程序3-3】分析以下程序的运行结果。
/*文件名:chap03_3.cpp*/
#include <stdio.h>
void main()
{
int a=3,b=7;
printf("%d,",a++ + ++b); /*①*/
printf("%d,",b%a); /*②*/
printf("%d,",!(a>b)); /*③*/
printf("%d,",a+b); /*④*/
printf("%d,",a&b); /*⑤*/
}
程序运行结果:
11,0,1,12,0
在语句①中,a++返回3,a为4,++b返回8,b为8,输出3+8=11;语句②中,b%a=8%4=0,输出0;语句③中(a>b)返回0(假),取非后返回1,输出1;语句④中,a+b=4+8=12,输出12;语句⑤中a&b=0(按位与),输出0。