1、第 2 章 数据类型、运算符与表达式,1整型数的二进制表示 整型数分为有符号的和无符号的两种; 有符号的整型数的正负号由字节的最高位来表示:0表示正数,1表示负数。 整型数占用的字节数可为8位、16位或者32位。 整型数的取值范围:,2.1 用二进制表示的数,2浮点数的二进制表示 浮点数分成单精度浮点数和双精度浮点数; 单精度浮点数占32位(4个字节),双精度浮点数占64位(8个字节)。 浮点型数据的一般表达式: (1)S2eme是实际的阶码值,代表浮点数的取值范围;m是尾数,代表浮点数的精度。,2.1 用二进制表示的数,(1)单精度浮点型数据的字节分配空间:,2.1 用二进制表示的数,S代表
2、符号位,占1位。 E称为“移码”,占8位。E的取值范围为0255,E=127+e因此,e的取值范围为127+128); M代表有效位数或称为“小数”,m2=(1.M)2,(2)双精度浮点型数据的字节分配空间:,2.1 用二进制表示的数,S代表符号位,占1位。 E称为“移码”,占11位。E的取值范围为02047,E=1023+e因此,e的取值范围为1023+1024); M代表有效位数或称为“小数”,m2=(1.M)2,浮点型数据的取值范围:,2.1 用二进制表示的数,1. C语言提供5种基本数据类型。 (1)字符型:用char表示。 (2)整数型:用int表示。 (3)单精度实数型:用floa
3、t表示。 (4)双精度实数型:用double表示。 (5)空类型:用void表示。 对整数型,有四种修饰: signed(有符号) unsigned(无符号) long(长型) short(短型) 数据类型决定了数据的大小、数据可执行的操作以及数据的取值范围。,2.2 基本数据类型及取值范围,数据类型的长度和取值范围会随着机器的CPU类型和编译器的不同而不同。,2.2 基本数据类型及取值范围,例1:验证数据类型的字节长度。 见【例2-1】所示的程序:example2_1.c不同字节长度的数据类型和取值范围:见表2-5和表2-6,2.2 基本数据类型及取值范围,2.3常量与变量,标识符: 定义:
4、用来标识变量、常量、函数等的字符序列 组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线大小写敏感不能使用关键字长度:最长32个字符 命名原则:见名知意不易混淆 如1、l与I, o与0,例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123,C语言使用常量和变量来表示程序中使用的数据,常 量,一般用大写字母是宏定义预处理命令,不是C语句直接常量: 整型常量 实型常量 字符常量 字符串常量,如 #define PRICE 30,定义:程序运行时其值
5、不能改变的量(即常数)分类:符号常量:用标识符代表常量定义格式: #define 符号常量 常量,例 符号常量举例#define PRICE 30 main() int num,total;num=10;total=num*PRICE;printf(“total=%d“,total); ,运行结果:total=300,变 量,概念:其值可以改变的量。数据及其存储空间的抽象。变量名与变量值变量定义的一般格式:数据类型 变量1,变量2,变量n;,变量初始化:定义时赋初值,例:int a, b, c;float data;,决定分配字节数 和数的表示范围,合法标识符,例:int a=2,b,c=4;
6、float data=3.67;char ch=A;int x=1,y=1,z=1;int x=y=z=1;,例1 int student;stadent=19; /Undefined symbol stadent in function main,变量定义位置:一般放在函数开头,变量的使用:先定义,后使用,Error:expression syntax in function main,变量的赋值,传送数据到变量所代表的存储单元。 赋值操作用“=”表示,一般形式为:变量=表达式,如:a = 1.0; /* 把1.0传送给a*/a = a + 1; /*把a的值加上1后传给a*/ 用赋值号连接
7、变量和表达式的式子称为赋值表达式。 赋值符号的运算方向为自右向左。 赋值表达式的值是被赋值后的变量的值。如:d=c=b=a=3+5,赋值表达式,整型常量(整常数) 三种形式:十进制整数:由数字09和正负号表示.如 123,-456,0八进制整数:由数字0开头,后跟数字07表示.如0123,011十六进制整数:由0x开头,后跟09,af,AF表示. 如0x123,0Xff,例 12 与 12L,例 30000 为int型65536 为long int 型,整型常量的类型根据其值所在范围确定其数据类型在整常量后加字母l或L,认为它是long int 型常量,问题: 0123 = ( )10 0x1
8、23 = ( )10 0Xff = ( )10,整型变量 分类:有符号数和无符号数。用关键字signed, unsigned指定。基本型、长整型和短整型。用关键字int, long, short指定。字节数和表示范围 定义形式:数据类型 变量名例子: int x, y; /*定义x, y为整型数*/ unsigned short m, n; /*定义m, n为无符号短整型数*/ long a; /*定义a为长整型数*/,整型数据的存储方式 short int long 最高位为符号位,0为正,1为负 以二进制补码的形式存放如:10 的补码-10的补码,例 整型数据溢出 include main
9、() int a,b;a=32767;b=a+1;printf(“%d,%dn“,a,b); ,运行结果: 32767, -32768,说明计算机在运算时, 出现数据溢出情况, 达到最大值后,又从最小值算起。,整型数据的溢出,字符类型,在计算机中字符以ASCII存放以及运算。 其存储为1个字节如:a的ASCII码为97,它在内存中的形式:字符型变量定义方式:char a;表示a为字符型,在内存中占用8位即1个字节,#include main() int a = 97;printf(“%c = %dn”, a, a); ,输出:a = 97,字符常量 定义:用单引号括起来的单个普通字符或转义字符
10、.,字符常量的值:该字符的ASCII码值,如 101 -A 012 -n376 - x61 -a60 -0 483 -(),例: A-101-x41-65,如 A65, a97,048 , n10,如 a A ? n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,例 转义字符举例 main() printf(“101 x42 Cn“);printf(“I say:“How are you?“n“);printf(“C Programn“);printf(“Turbo C“); ,运行结果:(屏幕显示) A B C Isay:”How are you?” C Program Turbo
11、 C,例 main() printf(“Yb=n”);,运行结果: 屏幕显示:=,字符常量与字符串常量不同,字符串常量 定义:用双引号(“”)括起来的字符序列 存储:每个字符串尾自动加一个 0 作为字符串结束标志,例: char ch;ch=“A”;,没有字符串变量,用字符数组存放,例 /*字符可用于算术运算*/#define PRICE 10main() int num=3;int total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(“total=%d,ch1=%cn”,total,ch1);,运行结果: total=30, ch1
12、=d,例 /*转义字符的使用*/ #include main() printf(“ ab ct derftgn”);printf(“htibbj kn”);,f g d e,h j k,a,b,c,d,e,f,g,h,i,j,k,例 /*转义字符的使用*/ #include main() printf(“ABbCDEFrGHn”);,在屏幕上显示结果为:?,GHDEF,实数类型,实数在C语言中又称为浮点数。浮点数有且只有两种表示形式:1、十进制形式。这种形式的数由整数部分、小数点和小数部分组成。如:1.24,0.345 ,.222 ,234.0 ,333. ,0.0等。2、指数形式。这种形式用
13、来表示一些比较大的数值,它们是实数部分、字母E或e、整数部分。表示形式:e 要注意:1 字母E或e之前之后必须有数字 2 之后的数字必须为整数3 没有八进制或十六进制实数表示法 规范化浮点数:在字母e(E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零数字。,实型常量(实数或浮点数)表示形式:十进制数形式:(必须有小数点) 如0.123, .123, 123.0, 0.0, 123.指数形式:(e或E之前必须有数字;指数必须为整数) 如12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5,实型常量的类型默认double型在实型常量后加字母f或F,认为它是flo
14、at 型,实型变量单精度(4字节,67位有效数字):float a; 双精度(8字节,1516位有效数字):double a;,x被赋值了一个有效位数为11位的数字。在printf语句中使用%20.18f 指示printf语句在输出x时总长度应为20位,小数点位数占18位。 输出的结果表明float型的数据只接收7位有效数字。,sizeof运算符,用途:测定某一数据类型所占存储空间的长度。 格式:sizeof(类型标识符) 例子:,#include main() short s; long l; float f; char c;printf(“short is %d bytesn“, size
15、of(s); /* short is 2*/printf(“long is %d bytesn“, sizeof(l); /* long is 4*/printf(“float is %d bytesn“, sizeof(f); /* float is 4*/printf(“char is %d bytesn“, sizeof(c); /* char is 1*/ ,2.4 运算符和表达式,运算符(操作符)是表述最基本的运算形式的符号。 表达式由运算符(操作符)和运算量(操作数)组成,用以描述对什么数据以什么顺序进行什么操作。 任何有值的东西都可以称为表达式。,C语言中的运算符(13类),算术
16、运算符:+ - * / % + - 关系运算符: = != 逻辑运算符:! & | 位运算符 : | & 赋值运算符:= 及其扩展 条件运算符:?: 逗号运算符:, 指针运算符:* & 求字节数 :sizeof 强制类型转换:(类型) 分量运算符:. - 下标运算符: 其它 :( ),学习运算符应注意:,与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型,1 算术运算符和表达式,基本算术运算符: + - * / % 结合方向:从左向右 优先级: - 高于 * / % 高于 + - 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据 +
17、 - * /中任意数类型为实型,结果均为实型,例 5/2 =-5/2.0 =,例 5%2 =-5%2 =1%10 =5%1 =5.5%2,例 5/2 = 2 -5/2.0 = -2.5,例 5%2 = 1 -5%2 = -11%10 = 15%1 = 05.5%2 (),int a, b, c; float d; a*b/c-1.5 (a*b)/c*1.5,自增、自减运算符 + -,作用:使变量值加1或减1 优先级与相同,右结合 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值相当于i=i+1) 后置 i+,i- (先使用i值,再执行i+1或i-1),例 j=3; k=+j; j
18、=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,说明: + - 不能用于常量和表达式,如5+,(a+b)+ + -结合方向: 自右向左 优先级:- + - -* / % -+ -(2) (3) (4),例 -i+i=3; printf(“%d”,-i+);,例 -i+ -(i+)i=3; printf(“%d”,-i+); /-3,2赋值运算符和表达式,简单赋值运算符符号: =
19、格式: 变量标识符 = 表达式作用:将一个数据(常量或表达式)赋给一个变量,例 a=3;d=func();c=d+2;,复合赋值运算符种类:+= -= *= /= %= = = &= = |=,说明:结合方向:自右向左优先级: 2左侧必须是变量,不能是常量或表达式,例 3=x-2*y;a+b=3;,例 int i; i=2.56; /结果i=2;,例: a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量
20、的类型赋值表达式的值与变量值相等,且可嵌套,例: a=12; a+=a-=a*a,/a=-264 等价于a=a+(a=a-(a*a),3逗号运算符和表达式,形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 1 逗号表达式的值:等于表达式n的值 用途:求多个表达式的连续计算,常用于循环for语句中,例 a=3*5,a*4a=3*5,a*4,a+5 例 x=(a=3,6*3)x=a=3,6*a 例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值2
21、0,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,例: #include main() int x,y=7;int z=4;x=(y=y+6,y/z);printf(“x=%dn“,x); ,运行结果:x=3,4关系运算符和表达式,关系运算符种类:= !=结合方向:自左向右优先级别: 9-10运算结果为:1 或 0,例 int a=3,b=2,c=1,d,f;ab;c= ab;b+cb;f=abc;,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,关系运算注意事项:,例 若a=0; b=0.5; x=0.3;则 a=x=b的
22、值为,0,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,2,例 a0 结果为A100 结果为,1,0,例 注意区分“=”与“=” int a=0,b=1; if (a=b) printf(“a equal to b”); elseprintf(“a not equal to b”);,a equal to b,(a= =b),a not equal to b,5逻辑运算符和表达式,逻辑运算符 种类: ! & | 逻辑运算真值表,C语言中,运算量: 0表示“假”,非0表示“真”,运算结果: 0表示“假”,1表示“真”,例 ab&xya=b|x=y!a|ab,优先级: 1
23、454,结合方向:,/* (a=x) & (x=b)*/,/*(ab)&(xy)*/,/*(a=b)|(x=y)*/,/*(!a)|(ab)*/,例 a=4;b=5;!aa&ba|b!a|b4&0|253&2|84-!0c&d,值为1,值为0,值为1,值为1,值为1,值为1,(53)&2|(8(4-(!0) 值为1,逻辑运算的短路特性:,逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,例 a(m=ab)&(n=cd),/*结果m=0,n=1*/,6条件运算符与表达式,一般形式: expr1 ? expr2 : expr3 执行
24、过程 功能:相当于条件语句,但不能取代一般if语句,条件运算符可嵌套如 x0?1:(x0?-1:0) 优先级: 3,结合方向:自右向左如 ab?a:cd?c:d ab?a:(cd?c:d) expr1、expr2、expr3类型可不同,例 x?a:b /x=0,表达式值为b; x0,表达式值为axy?1:1.5 /xy ,值为1.0; xy ,值为1.5,良好的源程序书写习惯:表达式中,在双目运算符的左右两侧各加一个空格,可增强程序的可读性。 比较:“(x + y) / 2 1” 与 “(x+y)/21”尽量把复杂的表达式分成多个表达式来写。尽量使用圆括号显式指明哪部分先运算,而不是依赖运算符
25、的优先级。,#include main() int x,y=7;int z=4;x=(y=y+6,y/z);printf(“x=%dn“,x); ,#include main() int x;int y = 7;int z = 4;y += 6;x = y / z;printf(“x=%dn“, x); ,知识提示 : 结合性是语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。,不同类型数据间的转换,三种形式同一类型但长度不同的数据间的转换如:int x = 1; long y = 50000; x + y = 50001定点方式与浮点方式间的转换如:i
26、nt x = 1, float y = 1.0; x + y = 2.0整型数中有符号数和无符号数间的转换如:unsigned int x = 1; int y = -2;x + y = ?,65535,注意 有符号与无符号之转换 由有符号负数转为同长度的无符号数时,最高位不再被当作符号位,结果相当于216或232加上该负值 由无符号数(超出表示范围)转为同长度的无符号数时,最高位被当作符号位,结果相当于该数减去216或232。 实数转整数,小数被截取。double转float,超出有效数字范围的四舍五入。 数据转换可能丢失精度。在截取与四舍五入及long型转实型时可能发生。 数据转换结果具有
27、不确定性。将较长整数转为较短整数时,只低字节有效。double转float, 实数转整数时,如值超过目标类型的取值范围,则结果是不确定的。,#include main() long a = 80000, b = 3200L;short i, j;double d = 123456.789098765;float f;short s;i = a;j = b;f = d;s = d;printf(“%ld = %hdn“, a, i);printf(“%ld = %hdn“, b, j);printf(“%16.9lf = %f = %16.9hdn“, d, f, s); ,输出 80000 =
28、 14464 /* 80000 = 0x1 3880, 0x3880 = 14464 */ 3200 = 3200 123456.789098765 = 123456.789062500 = -7616,隐式转换什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换运算转换规则 不同类型数据运算时先自动转换成同一类型,转换结果使表达式中只有5种类型,即:int, unsigned int, long, unsigned long, double “向高看齐”原则。,显式转换(强
29、制转换)一般形式:(类型名)(表达式) 例 (int)(x+y)(int)x+y(double)(3/2)(double)3/2(int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变 优先级为15,右结合,例 main() float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i); 结果:x=3.600000,i=3,精度损失问题,1 * -2 + 3 / 4,Back,(int) x + y,(int) x + y,扫描方向,假设: x = -2.6 y = 3,-2,TC 规则:向零取整,1,Back,-i +,-i +,扫描
30、方向,假设: i = 1,1,-1,(1) 表达式的值:-1 (2) i 的值:2,Back,i + j,i + j,扫描方向,假设: i = 1 j = 2,1,3,(1) 表达式的值:3 (2) i 的值:2,Back,a += a -= a * a,a += a -= a * a,扫描方向,4,-2,(1) 表达式的值:-4 (2) a 的值:-4,-4,假设: a = 2,注:a = -2,Back,printf(“%d, %d”, i, i +);,printf(“%d, %d”, i, i +);,扫描方向,假设: i = 3,3,注:i = 4,4,注:C 函数参数的传递方向 自
31、右向左,printf(“%d, %d”, i, i = 30);,Back,习题,1、有两个整型变量a和b,下面a除以b的余数的表达式是() A. a/b B. a%b C. b%a D. a%=b 2、若原a的值为3,b的值为2,则执行a+=b+后,a与b的值为() A. a的值为3,b的值为2 B. a的值为5,b的值为3 C. a的值为5,b的值为2 D. a的值为3,b的值为3 3、数学上的“ab ? b: a C. c=ab ? a :b D. 以上都不对 5、与表达式“a!=b|bc”等价的表达式是() A. !(a=b & b=c) D. 以上都不对,!(a=b & b=c),6
32、、设有说明:char w; int x; float y; double z;则表达式w*x+z-y值的数据类型为() A. float B. char C. int D. Double 7、设x和y都是int类型,且x=100, y=200, 则printf(“%d”, (x,y);的输出结果是() A. 200 B. 100 C. 100 200 D. 输出格式符不够,输出值不确定 8、设有以下变量均为int类型,则值不等于7的表达式() A. (x=y=6, x+y, x+1) B. (x=y=6, x+y, y+1) C. (x=6, x+1, y=6, x+y) D. (x=6, y
33、+1, x=y, x+1) 9、在C语言中,要求运算符必须是整型的运算符是() A. / B. + C. != 200 D. % 10、下列运算符中优先级最低的是(),优先级最高的是() A. ? : B. & C. + D. ! = 11、以下关于运算符优先顺序的描述中正确的是() A. 关系算术赋值逻辑 B.逻辑关系算术赋值 C. 赋值逻辑关系算术 D.算术关系赋值逻辑,数据的输入和输出,C语言中I/O操作由函数实现#include 使用较多的函数:格式输出printf()格式输入scanf()字符输出函数putchar()字符输入函数getchar()字符串输出函数puts()字符串输入
34、函数gets(),1 字符数据的输入和输出,格式: putchar( c ) 参数: c为字符常量、变量或表达式,不能少 功能:把字符c输出到显示器上(一个字符的输出),#include 或 #include “stdio.h” 字符输出函数,putchar(A); /*将大写字母A输出到屏幕*/ putchar(48); /*将ASCII码为48的字符输出到屏幕*/ putchar(x); /*将变量X的值当成ASCII码值,并将此ASCII码 对应的字符输出到屏幕,这里X可以是字符型或整型变量*/,#include main() int c;char a;c=65; a=B;putchar
35、(c); putchar(n); putchar(a); ,运行结果:AB,例,1)putchar每次只能输出1个字符; 2)可以为字符变量、字符常量、转义字符 3)在程序最前必须包含一条预编译指令:#include “stdio.h“这条预编译指令的作用是告诉编译器,putchar()函数是在 stdio.h这个头文件中进行了说明。如果不进行事先说明的话, 一个函数是不会被编译器所识别的,除了printf()函数和scanf()函数。,字符输入函数:,格式: getchar( ) 功能:从终端(键盘)读入一字符 参数:无 注意:只接受一个字符,空格、回车符为有效字符需读入读入操作终止于ENT
36、ER的键入。,例,#include main() int c;printf(“Enter a character:“);c=getchar();printf(“%c“,c); ,运行结果: Enter a character:A A,putchar(getchar();,#include main() int c;printf(“Enter a character:“);c=getchar();printf(“%c-%dn“,c,c); ,运行结果: Enter a character:A A-65,2 格式输出函数,格式:printf(“格式控制串”,输出表) 功能:按指定格式向显示器输出数
37、据,输出表:要输出的数据(可以没有,多个时以“,”分隔) 格式控制串:包含两种信息 格式说明: %修饰符格式字符 ,用于指定输出格式 普通字符或转义序列:原样输出,printf(“%c-%dn“,c,c);,A-65 ,int a=65;printf ( “%d”,a);,int a=65;printf(“%x”,a);,int a=65;printf(“%o”,a);,int a=65;printf(“%u”,a);,char a=65;printf(“%c”,a);,printf(“%s”,“ABC”);,float a=567.789;printf(“%e”,a);,float a=56
38、7.789;printf(“%f”,a);,float a=567.789;printf(“%g”,a);,printf(“%”);,65,41,101,65,A,ABC,5.677890e+02,567.789000,567.789,%,说明 格式字符要用小写格式字符与输出项个数应相同,按先后顺序一一对应输出转换:格式字符与输出项类型不一致,自动按指定格式输出,例 main() unsigned int u=65535;printf(“u=%dn“,u);输出结果:u=-1,例 int a=3,b=4;printf(“%d %dn”,a,b); printf(“a=%d , b=%dn”,a
39、,b);,例 int a=3,b=4;printf(“%d %dn”,a,b); printf(“a=%d , b=%dn”,a,b); 输出结果: 3 4a=3, b=4,附加格式说明符(修饰符),格式指示符 1类型转换字符d以带符号的十进制整数形式输出。案例 类型转换字符d的使用。,#include main()int num1=123;long num2=123456;printf(“num1=%d, num1=%5d, num1=%-5d, num1=%2dn“,num1, num1, num1, num1);,运行结果: num1=123, num1=123, num1=123, n
40、um1=123,#include main()int num1=123;long num2=123456;printf(“num2=%ld, num2=%8ld, num2=%5ldn“,num2,num2,num2);,运行结果: num2=123456, num2=123456, num2=123456,#include void main() int x=-1;printf(“x=%o,x=%d“ ,x,x); ,运行结果: x=177777 , x=-1,2%o格式符。它的作用是将其对应的表达式的值按照八进制整数方式输出。 这个格式符不会输出负数形式。它将符号位也做为八进制的一部分输出
41、。,附加的格式说明符也可以和%o一起使用,看下面几个例子。 例子:printf(“x=%5o”,077); 运行结果:77 printf(“x=%lo”,0xFFFFF); 运行结果:3777777 printf(“x=%11lo”,0xfffff); 运行结果:3777777 printf(“x=%-11lo”,0xfffff); 运行结果:3777777,3%x格式符。它的作用是将其对应的表达式的值按照十六进制整数方式输出。,printf(“x=%x“,0xffff); 运行结果: x=ffff printf(“x=%8x“,0xffff); 运行结果: x=ffff printf(“x=
42、%lx“,0x7ffff); 运行结果: x=7ffff printf(“x=%8lx“,0x7ffff); 运行结果: x=7ffff printf(“x=%-8lx“,0x7ffff); 运行结果: x=7ffff,4.%u格式符。它的作用是将其对应的表达式的值按照十进制无符号整数方式输出。 也可以和上面的m, l, - 三种附加格式符组合使用。,printf(“x=%u“,-1); 运行结果: x=65535 printf(“x=%d,%o,%x,%un“,-2, -2, -2, -2); 运行结果: x=-2, 177776, fffe, 65534 printf(“y=%d,%o,%
43、x,%u“,(unsigned int)65535, -1, -1, -1); 运行结果: y= -1, 177777, ffff, 65535,(-2)=1111 1111 1111 1110(65535)=1111 1111 1111 1111,5%c格式符。它的作用是将其对应的表达式的值按照字符方式进行输出。如果一个整数的数值范围在0到255之间,也可以用字符方式输出其对应的ASCII码字符。 可以和附加格式符组合,printf(“x=%c“,A); 运行结果:x=A printf(“x=%c“,66); 运行结果:x=B printf(“x=%5c“,66); 运行结果:x=B,6s输
44、出一个字符串。 案例 类型转换字符s的使用。 #include main() printf(“%s,%5s,%-10sn“, “Internet“, “Internet“, “Internet“);printf(“%10.5s,%-10.5s,%4.5sn“, “Internet“, “Internet“, “Internet“); 程序运行结果如下: Internet,Internet,Internet Inter,Inter,Inter,7f以小数形式、按系统默认的宽度,输出单精度和双精度实数。,#include main() float f=123.456;double d1,d2;d1
45、=1111111111111.111111111;d2=2222222222222.222222222;printf(“%f, %12f, %12.2f, %-12.2f, %.2fn“, f,f,f,f,f);printf(“d1+d2=%lfn“, d1+d2); ,运行结果: 123.456001,123.456001,123.46,123.46,123.46d1+d2=3333333333333.333010,m:显示数据占有的列宽; .n:保留小数位数,存在四舍五入,(1)这个格式符将对应表达式的值的整数部分全部输出,并且输出6位小数。,本案例程序的输出结果中,数据123.45600
46、1和3333333333333.333010中的01和010都是无意义的,因为它们超出了有效数字的范围。,16位有效位,8%e格式符。它的作用是将其对应的表达式的值按照指数方式进行输出。,(1)这种方式输出的数据,以规范化浮点数形式输出,尾数(7位含小数点):整数部分只有1位且不能为0,小数位数占6 位;指数(4位):字母e占1位,指数的符号位占1位,指数占2位。 例如:Printf(“x=%e”,123.456); 运行结果:x=(1.23456e+02) (2)这个格式符也可以和m, .n, -三种附加格式符一起使用。含义与%f格式符中这三种附加格式符的含义一样。 例如: printf(“
47、x=%7e“, 123.456); 运行结果:x=(1.23456e+02) printf(“x=%8.1e“, 123.456); 运行结果:x=(1.2e+02) printf(“x=%-8.1e“, 123.456); 运行结果:x=(1.2e+02),m:表示以m列宽显示; .n:取的是尾数部分除小数点外的数据位数。,使用说明(1)printf()可以输出常量、变量和表达式的值。但格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。例如,printf(“str=%s, f=%d, i=%fn”, “Internet”, 1.0 / 2.0, 3 + 5, “CHINA”);是错误的。(2)格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包含的字母也大写。除了x、e、g格式字符外,其它格式字符必须用小写字母。例如,%f不能写成%F。(3)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。例如,“printf(”c=%c, f=%fn“, c, f);”中的第一个c和f,都是普通字符。,