第2章数据类型、运算符和表达式_第1页
第2章数据类型、运算符和表达式_第2页
第2章数据类型、运算符和表达式_第3页
第2章数据类型、运算符和表达式_第4页
第2章数据类型、运算符和表达式_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章数据类型、运算符和表达式2.1常用的进位制

2.3常量2.2数与字符在计算机内存中的表示2.4变量2.5常用运算符与表达式2.6基本输入/输出操作结束放映2.1常用的进位制C语言中的数据类型2.1.1二进制数、八进制数与十六进制数十进制数有10个数码:0~9,加法运算采用“逢十进一”的进位法则二进制数有2个数码:0和1,加法运算采用“逢二进一”的进位法则八进制数有8个数码:0~7,加法运算采用“逢八进一”的进位法则。十六进制数有16个数码:0~9和A~F,加法运算采用“逢十六进一”的进位法则2.1.2二进制数、八进制数、十进制数和十六进制数之间的换算二进制(八进制或者十六进制数)转换为十进制数的换算方法采用按权展开逐个相加的方法十进制数转换为二进制数的换算方法十进制数的整数部分采用除以二取余数,直到商为零;十进制数的小数部分采用乘以二取整(即十分位向个位的进位),直到小数部分为零(或者精确到小数点后规定的位数)。二进制数转换为八进制数的换算方法转换时以小数点为分界线,整数部分从低到高,小数部分从高到低按位数分组,每3位二进制数对应1位八进制数;分组时若不足3位数时,整数部分要在前面补0、小数部分要在后面补0。二进制数转换为十六进制数的换算方法转换时以小数点为分界线,整数部分从低到高,小数部分从高到低按位数分组,每4位二进制数对应1位十六进制数;分组时若不足4位数时,整数部分要在前面补0、小数部分要在后面补0。2.2数与字符在计算机内存中的表示本节介绍的主要内容包括:机器数和真值原码、反码与补码定点数与浮点数

ASCII编码2.2.1机器数与真值1.机器数计算机只能识别“0”和“1”两种数码。数的正、负符号也可以用“0”和“1”来表示,具体地,把一个数的最高位作为符号位,称为数符,用“0”表示正,“1”表示负,其余位仍然表示数值。注意:机器数表示的范围受到字长的限制,例如,如果表示一个整数,字长是16位,那么最大值是0111111111111111,因此16位整数的最大值是32767。如果超过32767,就要“溢出”。2.真值带符号位的机器数对应的数值称为机器数的真值。【例2.4】写出带符号位的机器数(00100001)2和(10100011)2的真值。(00100001)2=+33(10100011)2=-353.无符号数当计算机字长的所有二进位都用来表示数值时,称为无符号数。一般在不出现负数的情况下,可以使用无符号数。这样可以将最大数增大一倍。例如16位无符号数的最大值是(1111111111111111)2,也就是65535。2.2.2原码、反码和补码1.原码整数X的原码是指:其数符位0表示正,1表示负,其数值部分是X的绝对值的二进制表示。[+1]原=00000001[+127]原=01111111[-1]原=10000001[-127]原=111111112.反码整数X的反码是指:对于正数,与原码相同;对于负数,数符位为1,其数值部分是X的绝对值取反,即1变0,0变1。例如:[+1]反=00000001[+127]反=01111111[-1]反=11111110[-127]反=100000003.补码整数X的补码是指:对于正数,与原码相同;对于负数,数符位为1,其数值部分是X的绝对值取反后最低位加1,即负数的补码等于其对应的反码加1。例如:[+1]补=00000001,[+127]补=01111111[-1]补=11111111,[-127]补=100000012.2.3定点数和浮点数计算机处理的数多数带有小数点,小数点在计算机中不占二进位,那么如何表示小数点的位置,反映数值的大小?

一般有两种表示方法:第一种是约定机器数的小数点隐含在某一固定位置上的定点表示法第二种是小数点位置可以任意移动的浮点表示法1.定点数当约定小数点位置固定在机器数的最低位之后时,称为定点整数。当约定小数点位置固定在符号位之后,有效数值部分最高位之前时,称为定点小数。定点小数在计算机中的格式表示如图2-3所示:2.浮点数

任何一个二进制的浮点数(也称为实数)都可以表示成如下的形式:其中,S为尾数,J为阶码。例如:

在计算机中规定浮点数的尾数采用纯小数形式,上例中的0.100011和0.0100011。如果尾数的最高位为1,则称为规格化数,因此上例中的就是规格化数。浮点数在计算机内部的表示形式如下图2-4所示。例:二进制数在计算机中的存储方式如图2-5所示(阶符一位,阶码两位原码,数符一位,尾数四位原码)。数的定点表示和浮点表示各有优缺点,在不同的场合都得到使用。当所占用的位数相同时,浮点数所表示的数的范围要比定点数大,运算精度一般比定点数要高,但浮点数的运算规则比定点数运算规则要复杂,所以相应的计算机运算部件也比较复杂。2.3常量所谓常量(constant),是指在程序运行过程中,其值不可改变的量。在C语言中常量具有整型、实型和字符型。例如:1234、-12为整型常量,1234.,123.4和-123.4为实型常量,‘a’与‘A’都为字符型常量。程序中,这种能够从字面上看出数值的常量称为字面常量(或直接常量),另外可以使用一个标识符来代表一个常量,称为符号常量。2.3.1整型常量整型常量可以用下面三种形式表示:★十进制整数:如2001,-18,0。★八进制整数:在八进制整数的前面加一个0。如02001表示(2001)8、-017表示-(17)8,而019则是错误的,因为八进制数不可能出现数码9。★十六进制整数:在十六进制整数的前面加一个0x。如0x2001表示(2001)16,0xAB12表示(AB12)16。VisualC++6.0中的整型常量可分为:1.基本型(int)一个基本型常量占用32比特的内存单元,按补码形式存储,取值范围为-231~231-1。2.长整型(long)一个长整型常量占用32比特的内存单元,取值范围为-231~231-1。在书写长整型常量时,要以英文字母l或L结尾,如123456L。3.无符号型(unsigned)无符号型是指内存单元中只存数据位而不存符号位。无符号基本型整数(unsignedint)的取值范围与无符号长整型数(unsignedlong)的取值范围相同,都为0~232-1。无符号基本整型常量要以字母u或U结尾,如123u,无符号长整型常量要以字母ul或UL结尾,如123456UL。2.3.2实型常量1.实型常量的两种表示方式实型数据也称为浮点数,在C语言中的实型常量具有以下两种表示方法:(1)十进制小数形式。这是最普通的表示方式。要注意,一定要有小数点,例如:2002.,.2002,-3.14,0.0。(2)指数形式。由数字部分、小写字母e(或大写字母E)和作为指数的整数组成。例如:要将2002.168写成指数形式,可以有多种形式:2002.168e0,200.2168e1,20.02168e2,2.002168e3等。其中的2.002168e3称为“规范化的指数形式”。一个实数在按指数格式输出时,是按规范化指数形式输出的。2.实型常量的分类(1)单精度实数(float)单精度实型数的有效数字为6~7位,数值的范围为10-37~1038

。(2)双精度实型数(double)双精度实型数是另外一种类型的实数。在VisualC++6.0中,双精度实型数占用内存单元为64比特,数值范围是10-307~10308,有效数字是15~16位。2.3.3字符常量字符常量是一个整数,写成用一对单引号括住的单个字符的形式,例如‘a’,‘A’,‘x’,‘$’都是字符常量字符在内存中以ASCII码值的形式存储。例如从ASCII码表中可以查出字符‘a’的ASCI码值是97,它在计算机内部的存储形式如图2-7所示。字符常量的存储形式与整数的存储形式类似,所以字符常量的值就是该字符的ASCII码值,例如字符'0'的值是48,而不是数值0。在实际编程时,应该记住一些常用字符的ASCII值,由此可以推导出其它字符的值。★字符'A'的ASCII值是65★字符'a'的ASCII值是97★字符'0'的ASCII值是48★空格字符‘‘的ASCII值为32【例2.5】写出下列程序的运行结果。#include<stdio.h>voidmain(){

inti,j; i=65; /*字符'A'的ASCII码值*/ j=i+1; /*字符'B'的ASCII码值*/ printf("%c,%c\n",i,j); /*以字符形式输出*/printf("%d,%d\n",i,j); /*以整数形式输出*/}程序运行结果如下:A,B65,662.3.4字符串常量字符串常量也叫字符串字面值,是用一对双引号括住的由0个或者多个字符组成的字符序列。例如,“Iamastudent.”、“WindowsXP”和“”(空字符串)等C语言规定:在每一个字符串的结尾系统自动加上一个字符串结束标志符‘\0’,以便判断字符串是否结束。所以字符串“China”在内存中的存储形式如图2-8所示,

从图中能看出存储该串所需的字符数不是5而是6。另外,字符串“a”包括了两个字符‘a’和‘\0’,故"a"不同于'a'。2.3.5符号常量符号常量(也称为宏名),它是用一个标识符来代表的常量,C语言中用#define来定义一个符号常量,符号常量一般用大写字母来表示。(有关内容在第四章中有详细论述)例如:通过使用以下形式定义了一个符号常量PI,在预编译程序时将代码中所有的PI都用3.1415926来代替。#definePI3.1415926【例2.6】下面一段程序是按华氏温度与摄氏温度的转换公式:°C=(5/9)(°F-32)打印出0°F,10°F,20°F,…,直到100°F之间的华氏温度与摄氏温度的对照表。#include<stdio.h>#defineLOWER0 /*表的下限*/#defineUPPER100 /*表的上限*/#defineSTEP10 /*步长*/voidmain(){intf;floatc;for(f=LOWER;f<=UPPER;f+=STEP){c=5.0f/9.0f*(f–32);printf("%3d,%6.1f\n",f,c);}}2.4变量简单地说,变量是指其值在程序运行过程中会发生改变的量。在程序设计中,必须通过变量名来使用变量。在给变量命名时,必须用标识符来表示,不能把关键字当作变量名来使用。在C语言中,对所有的变量均要求“先定义,后使用”,而且在定义变量名时,尽量做到“见名知意”。2.4.1整型变量在C语言中具有以下6种整型变量:有符号基本整型:[signed]int无符号基本整型:unsignedint有符号短整型:[signed]short[int]无符号短整型:unsignedshort[int]有符号长整型:[signed]long[int]无符号长整型:unsignedlong[int]整型变量的定义C语言规定程序中使用的变量必须“先定义,后使用”,一般放在一个函数开头的说明部分,它的作用域仅限于该函数内部(关于变量与其作用域的内容将在第4章中介绍)。同一类型的变量可以任何方式分散在多个说明中,例如:intlower,upper,step;floatx,y;变量在说明时可以同时初始化。例如:inti=0;intlimit=MAXLINE+1; /*MAXLINE是符号常量*/intj,k=10; /*可以对变量的一部分初始化*/intlower=0,upper=100,step=20; /*对几个变量初始化*/charc='s';【例2.7】写出下列程序的运行结果。#include<stdio.h>voidmain(){inta=1;intb=-1;unsignedc,d;c=a;d=b;printf("a=%d,b=%d,c=%d,c=%u,d=%d, d=%u\n",a,b,c,c,d,d);}运行结果如下:a=1,b=-1,c=1,c=1,d=-1,d=4294967295例2.7程序分析:为什么d为作有符号数(%d)输出时是-1,而作为无符号数(%u)输出时却是4294967295?这是因为b赋值为-1,在内存中按补码形式存储为32个1,即:11111111111111111111111111111111当把b赋值给d时,d在内存中的存储也变为32个1。已知一个负整数的二进制补码表示,如何计算出它原来所对应的十进制整数?可以按照以下步骤来求:(1)将包含符号位在内的所有二进制补码的各位数字全部取反,即1变0、0变1;(2)将上述得到的结果转换为十进制整数;(3)加上负号;(4)上述结果最后再减去1。如果已知一个正整数的二进制补码表示,则它原来所对应的十进制整数,实际上就是将已知的补码直接转换成十进制整数。通过上述介绍可知,若把例2.7中的变量d看成是%d,由于补码的最高位(即符号位)为1,说明了原来的十进制整数应该是负数,经过上述四步计算得到的结果就是-1;若把变量d看成是%u,则按照二进制整数转换为十进制整数的方法,最后得到的结果就是4294967295(即232-1)。【例2.8】写出下列程序的运行结果。#include<stdio.h>voidmain(){shortinta,b;unsignedshorti,j;a=32767;b=a+1; i=65535; j=i+1; printf("a=%d,b=%d,i=%u,j=%u\n",a,b,i,j);}运行结果如下:a=32767,b=-32768,i=65535,j=0在VisualC++6.0中,将一个整型常量赋值给另一个整型变量时,要注意以下几点:(1)一个取值范围为[-32768,32767]的整数应被看作是shortint型常量,允许给int型和longint型变量赋值;同样,一个取值范围为[–2147483648,2147483647]的整数,应被看作是int型或者long型常量可以给longint型变量赋值。(2)由于int型与longint型的数据均占据相同长度的内存单位(即32比特),则int型常量同时也是longint型常量,可以赋给int型或longint型变量。(3)若要说明某个常量是longint类型的常量,可以在该常量的后面加上尾符大写字母L或者小写字母l。例1234是int型常量,而1234L或者1234l则是longint型常量。(4)在函数调用中,如果形参是longint型,那么实参也必须是longint型,如果实参与形参的类型不一致可以用强制类型转换来表示。2.4.2实型变量与实型常量相一致,实型变量也分为以下三种类型:float(单精度实型)double(双精度实型)longdouble(长双精度实型)【例2.9】写出下列程序的运行结果。#include<stdio.h>voidmain(){floatx1,x2,x3;doubley1,y2;x1=1.234567899e8f;x2=1234567.899e2f;x3=x1+1;printf("x1=%f\nx2=%f\nx3=%f\n",x1,x2,x3);y1=1.234567899e8f;y2=y1+1;printf("y1=%f\ny2=%f\n",y1,y2);}运行结果如下:x1=123456792.000000x2=123456792.000000x3=123456793.000000y1=123456792.000000y2=123456793.000000【例2.10】写出下列程序的运行结果。#include<stdio.h>voidmain(){floatx1,x2,x3,x4; doubley1,z1,z2,z3; x1=1234.567899f; x2=99876.54321f; x3=x1*x2; x4=1234.567899f*99876.54321f; printf("x3=%f\nx4=%f\n",x3,x4); y1=1234.567899*99876.54321; printf("y1=%f\n",y1); z1=1234.567899; z2=99876.54321; z3=z1*z2; printf("z3=%f\n",z3);}例2.10的运行结果:x3=123304376.000000x4=123304376.000000y1=123304374.110152z3=123304374.110152程序分析:分析运行结果,可以看出系统将实型常量1234.567899和99876.54321按双精度数据处理,这样可以提高计算的精度。如果在实型常量后面加上f(或F),系统就会按单精度数据处理。2.4.3字符型变量字符型变量用来存储字符常量。一个字符变量在内存中只占一个字节,只能存储一个字符。下表2-5列出了VisualC++6.0中字符类型的取值范围。【例2.11】写出下列程序的运行结果。#include<stdio.h>voidmain(){charc1,c2; c1=‘A’; /*字符A*/ c2=c1+1; /*字符B*/ printf("%c,%c\n",c1,c2); /*以字符形式输出*/printf("%d,%d\n",c1,c2);/*以整数形式输出*/}运行结果如下:A,B65,66【例2.12】写出下列程序的运行结果。#include<stdio.h>voidmain(){inti;charc;c=0x41;i='B';printf("%c,%d\n",c,i);}程序运行结果如下:A,66【例2.13】写出下列程序的运行结果。#include<stdio.h>voidmain(){charc;unsignedchard;c=255;d=255;printf("c=%d\nd=%d\n",c,d);}程序运行结果如下:c=-1d=2552.5常用运算符与表达式C语言的运算符非常丰富,根据运算符的性质可以分为算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、条件运算符、自增和自减运算符、逗号运算符、指针运算符、强制类型转换运算符、分量运算符、下标运算符、求字节数运算符、函数调用运算符等。根据所需要的操作数个数,运算符又可以分成单目运算符、双目运算符和三目运算符。2.5.1算术运算符与算术表达式基本算术运算符包括:+(加法运算符,或正值运算符)-(减法运算符,或负值运算符)*(乘法运算符)/(除法运算符)%(求余运算符或模运算符)算术表达式:用算术运算符和括号将运算对象连接起来的式子称为算术表达式。运算对象包括常量、变量和函数等。例如:x*y/z+2002.168–15%(-7)+'A'C语言规定算术运算符的优先级为先做*,/,%;后做+,-。即“*,/,%”属同一优先级,“+,-”属同一优先级,而且前者优先级高于后者。在表达式求值时,同一优先级的运算符的运算顺序规定为“自左至右”,即运算对象先与左面的运算符结合,也称为“左结合性”(见表2-6)2.5.2赋值运算符与赋值表达式赋值运算符用“=”来表示。它的作用是将一个表达式的值赋给一个变量,而不是数学中的等号。由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为:变量名=表达式凡是双目(二元)运算符,都可以与赋值符一起组成复合赋值符。它的一般形式为:变量名双目运算符=表达式等价于:变量名=变量双目运算符表达式例如:x+=3等价于x=x+3x%=3+a等价于x=x%(3+a)使用赋值运算符“自右而左”的结合原则,可以处理各种复杂赋值表达式的求值。

已知intx=2,计算下述表达式的值。x+=x-=x*(y=11)解答:先进行“x-=x*(y=11)”的运算,相当于x=x-x*(y=11),经计算得到x=-20再进行x+=-20,相当于x=x+(-20)=(-20)+(-20)=-40因此最后表达式的值为-402.5.3强制类型转换运算符当两种不同类型的数据进行运算时,C语言会自动按规则进行类型的转换(譬如将int类型的数据赋值给float类型的变量),此外,程序员还可以利用强制类型转换运算符将一个表达式转换成所需要的类型。强制类型转换运算符的一般形式:(类型名)表达式例如:表达式(int)(x+y)表示先对x+y求和,再将和值转换成int类型,此时就不能误写成(int)(x)+y。2.5.4自加、自减运算符C语言为变量增加与减少提供了两个奇特的运算符:加一运算符++用于使其运算分量加1减一运算符--用于使其运算分量减1++与--这两个运算符既可以用作前缀运算符(即用在变量名前面,如++n),也能用作后缀运算符(即用在变量名后面,如n++),虽然都能使n加1,但二者存在差别:表达式++n:在n的值被使用之前,先使n加1表达式n++:在n的值被使用之后,再使n加1例如:如果已知intn=5,那么情况I:x=n++;最后的结果:x=5,n=6情况II:x=++n;最后的结果:x=6,n=62.5.5逗号运算符与逗号表达式用逗号运算符将两个表达式连接起来所形成的表达式称为逗号表达式,其格式为:

表达式1,表达式2逗号表达式的求解过程:先求解表达式1,再求解表达式2,则整个逗号表达式的值就是表达式2的值。例如,z=(x=10,10+20),z的值为30,x的值为10。逗号表达式中的表达式又可以是一个逗号表达式,这样逗号表达式的一般形式就可以扩展成:

表达式1,表达式2,表达式3,…,表达式n整个逗号表达式的值就是表达式n的值。2.5.6位运算所谓位运算,就是指对一个数的二进制位的运算。在汇编语言中有位操作的指令,不过C语言也提供了位运算功能,可用于单片机的开发领域,因此C语言既具有高级语言的特点,同时又具有低级语言的特点。C语言提供了6个用于位操作的运算符,这些运算符只能作用于各种整型数据(如char型、int型、unsigned型、long型)。& 按位与AND(二元运算符)| 按位或OR(二元运算符)^ 按位异或XOR(二元运算符)<< 按位左移(二元运算符)>> 按位右移(二元运算符)~ 按位取反(一元运算符)&按位与运算参加运算的两个操作数按二进制位进行“与”运算,规则如下:0&0=00&1=01&0=01&1=1&运算经常用于屏蔽某些二进制位。【例2.14】假设办公楼有16层,每层过道里都装了照明灯。已知第1层过道中的灯是开着的,其它楼层里的灯有的开有的关。为了节电的需要,现在要求只保留第1层过道里的灯照明,其它楼层的灯全部要熄灭,请问如何实现?分析:本题可以用一个数字开关来控制。这里定义一个short类型的变量switch,规定它的每一个二进制位自右向左分别对应着第1层至第16层的开关,其中若某位是0,表示那一层的灯是关着的,为1则表示开灯。此时的控制语句写为:switch=switch&0x0001;|按位或运算参加运算的两个操作数,按二进制位进行“或”运算。运算规则如下:0|0=00|1=11|0=11|1=1|运算经常用于设置某些位。【例2.15】如果想要1楼、3楼与5楼的照明灯都打开,则可以这样运算:switch=switch|0x0015;^按位异或运算参加运算的两个操作数,按二进制位进行“异或”运算。运算规则如下:0^0=00^1=11^0=11^1=0从运算规则可以看出,与“1”异或位取反,与“0”异或位保留。按位异或还有一个特点:在一个数据上两次异或同一个数,结果变回到原来的数。这个特点常常使用在动画程序设计中。【例2.16】将short型变量x的低5位都取反(即1变0、0变1),可以这样运算:x=x^(0000000000011111)2

即x=x^0x001f~按位取反运算~运算符是一个单目运算符,它用来对一个二进制数按位取反,即1变0、0变1。~运算符的优先级比算术运算符、关系运算符和其他的位运算符都要高。【例2.17】将short型变量x的低6位全部置为0,可以这样运算:x=x&~077相当于x=x&(~077)<<按位左移运算符x<<n表示把x的每一位向左移动n位,右边空出的位置补0,同时原来的高位经过左移之后丢弃不用。例如:对于变量shortx=64;则x对应的二进制表示为0000000001000000。将x左移一位可以由语句x=x<<1;实现,其运算过程如下:(0000000001000000)2<<1转换为(0000000010000000)2而(0000000010000000)2对应的十进制整数是128,也就是说64<<1相当于64×2=128。在一定范围内的按位左移n位,相当于原数的十进制数乘以2n但要注意这里所说的范围限制,例如:(0100000000000000)2<<2之后却成为(0000000000000000)2>>按位右移运算符x>>n表示把x的每一位向右移动n位,移到右端的低位被丢弃。对无符号数而言,左边空出的高位要补0,而对于有符号数,左边空位上要补符号位上的值。例如,无符号数15右移2位,即15>>2,相当于(0000000000001111)2>>2,结果为(0000000000000011)2;而对有符号数–6右移2位,即(–6)>>2,相当于(1111111111111010)2>>2,结果就应该是(1111111111111110)2此时得到的结果就仍然是有符号数。2.6基本输入/输出操作在C语言中,输入/输出操作是通过函数调用来实现的。用户只要直接调用C语言标准函数库中的标准输入/输出函数,就可以完成输入/输出操作。由标准库提供的输入/输出模型非常简单。在使用标准输入/输出函数时,要在程序的开头加上文件包含命令:#include<stdio.h>2.6.1字符的输入和输出

标准库中的getchar()和putchar()函数通常用于在终端设备上一次读取/写入一个字符。实际上在使用终端设备时,系统会自动打开三个标准文件:标准输入、标准输出和标准错误输出文件,而标准输入和标准输出可以通过重定向手段重定向到某一数据文件。使用getchar()函数时,从输入设备(即键盘)上读入一个字符,并将其作为结果值返回。使用putchar()函数时,在输出设备(即命令提示符窗口或称MS-DOS窗口)上显示一个字符。【例2.18】下面的程序运行时,会把从键盘上输入的任意字符全部显示在屏幕上。如果键入组合键【Ctrl+Z】或者功能键【F6】,则运行结束。#include<stdio.h>voidmain(){intc;while((c=getchar())!=EOF)putchar(c);}【例2.18】程序分析:(1)从键盘上键入的字符在计算机内部是按位模式存储的,所以任何整数类型也可以存储字符数据。(2)while循环语句的执行过程:首先检测圆括号内的条件,如果为真,则执行循环体;然后重新检测条件,为真,再执行循环体,直到条件为假,循环结束。(3)EOF:为了区分文件的正常字符与文件的结束标记。C语言在头文件stdio.h中定义了一个整数EOF,此处代表文件结束符。(4)利用重定向手段将输入指向一个文本文件,运行程序,在屏幕上显示该文本文件。如果不做输入重定向,则输入为键盘,运行程序,输入一个字符,显示该字符,直到按【Ctrl+Z】组合键或功能键【F6】键结束。2.6.2带格式数据的输入与输出

上一节介绍的两个函数putchar()和getchar()只能够输入/输出一个字符,如果要求输入/输出任意类型的数据,并且按照指定的数据格式进行输入/输出,则需要用到格式化输出函数printf()和格式化输入函数scanf()。1.printf()函数printf()函数是有格式的输出函数,它能够对任意类型的内部数值按照指定格式的字符形式显示。printf()函数的一般格式如下:printf(格式控制字符串,输出值参数表);其中格式控制字符串和输出值参数表是printf()函数的参数。例如:(1)格式控制字符串格式控制字符串包括两部分:按照原样不动输出的普通字符和用于控制printf()函数中形参转换的转换规格说明。转换规格说明由一个“%”开头到一个格式字符结尾,表2-8列出了常用的printf()函数格式转化说明符。如果只输出字符串时,则输出值参数表可以省略,例:printf("ThisisaCprogram.");在字符%和转换字符中间可以指定输出域宽和精度。【例2.19】写出下列程序的运行结果。#include<stdio.h>voidmain(){shortx=-1;printf("%%d:%d\n%%u:%u\n%%o:%o\n%%x:%x\n",x,x,x,x);}运行结果如下:%d:-1%u:4294967295%o:37777777777%x:ffffffff【例2.19】程序分析:short类型的变量x的值为-1,它在内存中按补码形式的存储格式为16个1,即:11111111111111111111111111111111采用%d格式输出时,是按照十进制int类型的整数(32位)来输出,得到的结果仍然是-1;已知一个负整数的二进制补码表示,如何计算出它原来所对应的十进制整数?可以按照以下步骤来求:(1)将包含符号位在内的所有二进制补码的各位数字全部取反,即1变0、0变1;(2)将上述得到的结果转换为十进制整数;(3)加上负号;(4)上述结果最后再减去1。【例2.19】程序继续分析:采用%u格式时,是按照十进制unsignedint类型(32位)来输出,原来存储时的符号位1,被当作数值位来处理,直接把二进制转换为十进制,得到的结果为4294967295;采用%o格式输出时,是按照八进制int类型的整数(32位)来输出,得到的结果为37777777777;采用%x格式输出时,是按照十六进制int类型的整数(32位)来输出,得到的结果为ffffffff;另外,此例子中格式符“%%d”的输出结果为%d,注意它与“%d”的输出结果不同。【例2.20】写出下列程序的运行结果,其中格式符"%s"用于字符串的输出。#include<stdio.h>voidmain(){ printf("%c%s\n",'T',"hisisastring.");}运行结果如下:Thisisastring.【例2.21】写出下列程序的运行结果。#include<stdio.h>voidmain(){floatx=12.3456789f;doubley=1234567891234.123456789;printf("%f\n%f\n%e\n%g\n",x,y,y,y);}运行结果如下:12.3456791234567891234.1235001.234568e+0121.23457e+012%f格式符以小数形式输出时,默认6位小数;单精度的有效位数一般为7位,而双精度的有效位数一般为15位。【例2.22】写出下列程序的运行结果。#include<stdio.h>voidmain(){intx=123;printf("%6d\n%06d\n%-6d\n%2d\n",x,x,x,x);}运行结果如下:123{占6列宽,域宽值大于实际位数时,右对齐,左补空格}000123{有前导0时,左补0}123 {域宽为负数,左对齐,右补空格}123 {域宽值小于实际位数时,按实际位数输出}本例中的%6d中的6是域宽指示,它必须为整数,指定了对应的输出项所占的字符个数。【例2.23】写出下列程序的运行结果。#include<stdio.h>voidmain(){floatx=12.345f;printf("%.2f\n%.2s\n",x,"abcde");}运行结果如下:12.35ab程序分析:.n(n为正整数),对于浮点数,指定输出的小数位数,对于字符串,指定从字符串左侧所截取的字符串个数。(2)输出值参数表。输出值参数表可以是常量、变量和表达式,它们之间用逗号隔开,输出值的数据类型和个数应该与格式转换符相匹配。2.scanf()函数scanf()函数是有格式的输入函数,可以按照格式字符串指定的格式读入若干个数据,并把它们存入参数地址表指定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论