1、1,第三章 数据类型及格式输出(4.5.1 )、运算符与表达式,主要内容C的数据类型各类数值型数据混合计算,常量与变量整型数据及格式输出实型数据及格式输出 字符型数据及格式输出字符串及格式输出变量的赋初值,算术运算符和算术表达式赋值运算符和赋值表达式逗号运算符和逗号表达式,2,如何表示数据?,类型:C的数据类型 命名:由标识符组成 形式:常量、变量,如何使用数据?,组成表达式:由数据和运算符组成 实现某种运算 数据的输入输出:使用输入和输出函数,3, C 的数据类型,4, C 语言的标识符,标识符: 用来标识变量名、符号常量名、函数名、数组名、类型名的有效字符序列。 标识符命名规则:以字母或下
2、划线开头;由字母、数字、下划线组成;大、小写有区分;保留关键字不能作为标识符;TC要求不超过32个字符;,5, C 语言的标识符,a1,abc.c,a_b,a-b,INT,3a,判断下列用户标识符的合法性:,int,.不能作标识符,-不能作标识符,不能以数字开头,关键字不能作标识符,6,常量与变量,常量: 在程序运行中,其值不变的量,如:23.7, - 67 等。 变量: 在程序运行过程中,其值可以改变的量,在内存中占据一定的存储单元。,7,一、常数常量与符号常量,两类常量:常数常量和符号常量 符号常量: 用标识符表示的常量。符号常量定义在函数之外, 定义格式为: #define 标识符 常量
3、例如: #define PI 3.14159,含义:定义PI为符号常量(习惯用大写字母),其值为3.14159,常量不能被赋值,如在定义PI为符号常量后PI=3.14 就是错误的,8,#define BOX_PRICE 5 main() int box_num,amount;box_num=180;amount=box_num* BOX_PRICE ;printf(“amount is %d”,amount);,9,二、变量,变量以标识符命名。 变量必须先定义后使用 每个变量必须被指定为一种类型,以便编译系统为其分配适当的内存空间 变量的定义格式: 类型名 标识符1,标识符2,标识符n;,一般
4、习惯上用小写字母表示变量, 用大写字母表示符号常量,以示区别。(仅是习惯不是规定),int a,b,c; /* a,b,c 为整型变量 */float x,y,z; /* x,y,z 为单精度型变量 */,10,3.3 整型数据,注:整数在计算机中按定点整数的补码存储。,11,一、整型数据在内存中的存放形式,例如:整数 34 的16位(2字节)编码 原码:00000000 00100010 反码:00000000 00100010 补码:00000000 00100010,例如:整数-34 的16位(2字节)编码 原码:10000000 00100010 反码:11111111 1101110
5、1 补码:11111111 11011110,12,数值在-3276832767 范围内的整型常量只需要表示成(短)整型常量,根据进制需要有以下表示方法:十进制: 如: 123, 0, -125 八进制: 以数字 0 开头如:(34)10 表示为 042(-83)10 表示为 -0123 十六进制: 以数字0 和 字母x 组合开头如: (34)10 表示为 0x22 (-49)10 表示为 -0X31,二、整型常量的表示方法 一般(短)整型,13,整型数据的溢出,数据的值超出系统为其分配的内存空间能表示的范围时,会发生溢出现象。 请自学P44相应内容,14,(1)数值超过 -327683276
6、7范围、但在 -2147483648(-231)2147483647(231-1) 之间的数必须表示成长整型常量,直接用其十 进制整数形式表示。 如 123456789:,(2)在-3276832767内的整数如果希望使用32位内存空间来存储,也可以表示为长整型常量,只需要在十进制整数后面加字母 l 或 L如 123l ,-123L,二、整型常量的表示方法 长整型,15,三、整型变量的定义,整型变量的定义形式:,整型类型名 变量名1,变量名2,变量名n;,如:int a,b,c;,long int a,b,c;,long a,b,c;,unsigned a,b,c;,以上定义四种类型的区别在于
7、:系统将根据定义的类型给变量分配大小不同的内存空间。,16,例3.3 (P44) main() int a,b;a=32767;b=a+1;printf(“%d,%dn“,a,b); 运行结果:32767,-32768,五、整型数据的溢出,32767: (0111111111111111)2 32767+1:(1000000000000000)2即 32768(%d),17,3.4 浮点型(实型)数据,注:实型数据在计算机中按规范化的浮点数形式存储,例如: 0 111110101 1 00101,18,浮点型常量的表示形式,十进制小数形式:如: .123, -2.5,123.等。.,注意:用指
8、数形式表示时,尾数和指数部分都不能空,指数部分必须为整数。,其中,123,2.45 称为尾数部分,+2 ,-2 称为指数部分。,例如:e+3、2.03e+0.5 都是非法的实型常量表示方法。,一、浮点型常量的表示形式,小数点不能省略,十进制指数形式:如:123*102 表示为 123e+2, 2.45*10-2 表示为 2.45e-2,19,二、浮点型变量的定义,浮点型变量的定义形式:,浮点型类型名 变量名1,变量名2,变量名n;,如: float a,b,c;,double a1,a2;,系统为三个变量分别分配32位内存空间。,系统为两个变量分别分配64位内存空间。,20,3.5 字符型数据
9、,注:字符在计算机中按ASCII码存储,占据1个字节。,21,空 格32,00100000,A65,01000001,a97,01100001,b98,01100010,P364,22,字符常量: 用单引号括起来的一个字符,存储长度是1个字节。 如: A, e。,一、字符常量和字符串常量,字符串常量: 一对双引号括起来的字符序列,隐含以0结尾。如:“ABCE”, 存储长度为5个字节; “ABtCE”,存储长度为6个字节。,注意: a 、a、 “a“互不相同,分别为变量、字符常量、字符串常量。 9 、9、“9”互不相同,分别为整型常量、字符常量、字符串常量。,23,转义字符:一对单引号括起来并以
10、“”开头的字符序列,如n、123, 长度为1个字节,其含义不是后的字符本身,而是转成为新的意义。,n 换行t 横向跳格,跳到下一个Tab位置b 退格(删除前面的一个字符) 表示一个单引号字符” 表示一个双引号字符ddd 表示13位8进制数所表示的字符xhh 表示12位16进制数所表示的字符,几个常用的转义字符: (P48表3.3),字符形式 功能,二、转义字符,24,printf(“n1234nabcd“);,printf(“abttdtefn);,printf(“1234b“);,printf(“ x41 “);,123, A “,转义字符的应用举例,1 2 3 4 a b c d,abtd
11、ef,25,三、字符变量,字符变量的定义: char 变量名;,例如:char c1,c2;,则变量c1、c2中可存储一个字符或者一个0255之间的无符号整数。,在C程序中,没有专门的字符串变量,需要把字符串保存在字符数组中。,26,小结,如何表示数据: 形式:常量、变量 数据类型:整型、浮点型、字符型 重点: 定义变量时,系统根据指定的数据类型给变量分配相应的内存空间。 注意每一种数据类型存储在内存的实际内容。,27,如何使用数据,定义变量存放数据(数据的表达) 给变量赋初值 变量之间的运算 使用运算符和数据组成表达式,28,3.6 变量赋初值,方法1) 变量初始化 在定义变量的同时为变量赋
12、初值如: int a=3; float x=5.89; int o,p,q=8; /*只有q 被赋初值*/不允许连续赋初值,如下: int a=b=c=8; 方法2)先定义变量,再用赋值语句赋值如: int a; a=3; /*赋值语句*/,29,3.7 各类数值型数据间的混合运算,数据类型的级别:,低,高,int,unsigned,long,double,float,char,横向的必须先转成纵向类型才能进行运算,30,各类数值型数据间的混合运算,运算规律:,2)两个不同类型数运算时,系统自动将低级类型转换为高级类型,而后进行同类型运算,结果为高级类型;,1)两个同类型数的运算结果为原类型;
13、,3)多个数运算时,类型转换是逐步进行的。,28+32,int,1/2,int 0,28+a,int,32768*32,long,double 0.0,2/3*6.3,32767*32,int,31,变量之间的运算,变量之间使用运算符组成表达式实现运算。 算术运算 算术表达式 赋值运算 赋值表达式 多个表达式的运算 逗号表达式 学习过程中要注意运算符的优先级和结合性: 优先级:当有一个表达式中有多个运算符时,按优先级别从高到低运算。 结合性:当一个表达式中多个运算符优先级别相同时,按结合性规定的方向运算。左结合性:运算对象先和它左侧的运算符进行运算右结合性:运算对象先和它右侧的运算符进行运算,
14、32,3.8 算术运算符和算术表达式,三类算术运算符号: 1. 基本算术运算符 2. 强制类型转换运算符 3. 自增、自减运算符 要求掌握每一种运算符号的 功能、优先级、结合性 P365 附录C ,结合性的含义:当某一运算对象两侧的运算符号优先级相同时,按照结合性所规定的方向进行运算。,33,一、基本算术运算符,基本算术运算符(五个): + (加) - (减) * (乘) / (除) % (求余) 优先级: (*、/、%)高于(+、-) 结合性: 自左向右 注意事项: 1. “ % ” 的运算对象必须为整数 2. 两个整数相除取整数商,例:2. 5%3 出错5/4 值为12.0/3 值为0.6
15、66667,34,二、强制类型转换运算符,强制类型转换运算符使用格式: (类型名)常量|变量|(表达式) 功能:将表达式的值强制转换为给定的数据类型 优先级:属单目运算符,仅低于括号类,高于基本算术运算符 结合性:自右向左(右结合性) 注意事项:类型名一定要用括号括起来。,float(2/3) 是错误的表示,例:5/2 的值是 2(float)5/2 的值是2.5,35,三、自增、自减运算符,运算符: +(自增) - -(自减)使用格式:变量+ 变量- - +变量 - -变量 功能:使变量的值自增1或自减1 优先级:属单目运算符,仅低于括号类,高于基本算术运算符 结合性:自右向左,例: 3 -
16、 - 出错- i - - 即 - ( i - -) ,非 (- i) - -,36,三、自增、自减运算符,注意事项:后置时,先使用、后自增(减) 对变量: 前置时,先自增(减)、再使用,例1:a=3; b=a+; 执行后, b的值为3,a的值为4 例2:a=3; b=+a; 执行后, b的值为4,a的值为4 例3:a=3; b= - a+ ;执行后, b的值为-3,a的值为4,37,四、算术表达式,表达式:用运算符号将运算对象按C语言的语 法规则连接起来的式子 算术表达式:用算术运算符号将运算对象按C 语言的语法规则连接起来的式子 运算对象:常量、变量、函数等,38,3.9+4.2 赋值运算符
17、、赋值表达式、赋值语句,赋值运算符: = 赋值表达式:变量 = 表达式功能:将“=”右侧表达式的值赋给左侧变量的值,赋值表达式的值就是被赋值变量的值。 赋值语句:变量 = 表达式;功能:将“=”右侧表达式的值赋给左侧变量的值。 * 所有表达式末尾加“;”后即变成语句,39,一、赋值运算符,赋值运算符: = 优先级:仅优先于最低级的逗号运算符 结合性:自右向左例:c=b=a=5 等效于 c=(b=(a=5) 注1)赋值运算符号不等于数学中的“等号”;注2)自增、自减运算实际上也是一个特殊的赋值运算符。,40,赋值运算过程,“变量=表达式” 的赋值运算过程: 计算右侧表达式的值; 类型转换:若赋值
18、运算符两侧的类型不一致,将右侧表达式值的类型转换为左侧变量的类型; 赋值给左侧变量。,41,赋值时的类型转换 P6062,例:main( ) float a=-32768.89; int i; unsigned j; i=a; j=i; a=j; ,-32768,32768.000000,32768,赋值运算小结(补充): 存储长度长的数据赋给存储长度短的变量,可能会丢失数据 存储长度短的数据赋给存储长度长的变量,保持数值大小不变; 数据赋给存储长度相同的变量,按存储形式原样照赋。,以有符号十进制形式输出i的值,以无符号十进制形式输出j的值,以实型小数形式输出a的值,结果:,42,复合赋值运算
19、符: *= /= += -= 等使用格式:变量 复合赋值运算符 表达式 功能:例如: a*=3 等价于 a=a*3a/=43*3 等价于 a=a/(43*3) 优先级: 仅优先于逗号运算符,与“=”同级。 结合性: 自右向左,二、复合赋值运算符,43,赋值表达式和赋值语句举例,例1:a+=a-=a*a 若a的初值为2赋值表达式,等效于:执行a=a-a*a后的表达式a=a+a计算后a的值为-4,该表达式值为-4 例2:sum=(a=123)+(b=456); 赋值表达式的值是其赋值运算符左边变量的值。赋值语句,等效于:a=123; b=456; sum=a+b;执行后 a的值为123,b的值为4
20、56,sum的值为579 赋值表达式的左值除了变量,也可以是(赋值表达式)。 如 (a=3*5)=4*3 表达式的值为12,44,3.10 逗号运算符和逗号表达式,逗号运算符: ,多目运算符 使用格式:表达式1,表达式2,表达式n 功能:从左到右依次求解各个表达式的值,最后一个表达式的值作为整个逗号表达式的值。 优先级: 最低 结合性: 自左向右,例:d=(a=3,b=5,c=a+b,c+2,a+) 依次进行逗号表达式中各表达式的运算,整个表达式的值是 , 计算结束后变量a、b、c、d的值分别是 。,3,4 、5、 8、 3,45,格式输出函数格式:printf ( 格式控制符,输出项列表)一
21、、输出项列表:一个或多个输出项组成(多个之间用逗号隔开),常量、变量、函数、表达式等均可做输出项。二、格式控制符:一般形式为双引号括住的字符序列,其中字符可由下面3类组成,系统将作相应的输出处理:1“%”起头的输出项格式符(与输出项一一对应)2普通字符(原样输出)3“”起头的转义字符(输出所表示的字符或实现其功能,见P48表3.3 ,详后述),四、整型数据的格式输出(略),P75,46,例: main( ) int a,b,sum; a=123;b=456;sum=a+b;printf(”a=%d,b=%d,c=%dn”,a,b,sum); 结果: a=123,b=456,c=579 _(换行
22、),原样 输出,格式符与输出项是一一对应的,转义字符,47,Printf格式字符说明表P81,48,附加格式说明字符,49,1. printf( )函数中整型数据的输出格式符(P76-82),%d(=%i) :以有符号十进制数形式输出整数。%md :以有符号十进制数形式输出整数,至少占m列(超过m列时按实际位数),右对齐。%-5d :以有符号十进制数形式输出整数,至少占5位,左对齐。,例: printf(“%d”, 32); 结果:32 Printf(“%d”,-32); -32,例: printf(“%5d”, 32); 结果: 32 Printf(“%5d”,-32); -32,例: pr
23、intf(“%-5d”, 32); 结果:32 ,50,%ld :以有符号十进制数形式输出长整数。%mld :以有符号十进制数形式输出长整数,至少占m列,右对齐。%u :以无符号十进制数形式输出整数。,例: printf(“%ld”, 32768); 结果: 32768 printf(“%ld”,-32768); -32768,例: printf(“%8ld”, 32768); 结果: 32768 printf(“%8ld”,-32768); -32768,例: printf(“%u”, 32768); 结果: 32768 printf(“%u”,-32768); 32768printf(“%
24、u”,-32); 65504,51,%o :以无符号八进制数形式输出整数(不输出前导符0)。%x(=%X ):以无符号十六进制数形式输出整数(不输出前导符0x) 。,例: printf(“%o”, 32); 结果: 40printf(“%o”,-32); 177740,例: printf(“%x”, 32); 结果: 20printf(“%x”,-32); ffe0,52,例(P77) main() int a=-1;printf(“%x, %o, %dn“,a,a,a);,整型数据格式输出举例,-1的原码: 1000000000000001 -1的补码: 1111111111111111 a
25、存储的内容: 1111111111111111运行结果:ffff,177777,-1,53,例4.3 (P77) main() unsigned int a=65535;int b=-2;printf(“a=%d,%o,%x,%un“,a,a,a,a);printf(“b=%d,%o,%x,%un“,b,b,b,b);,整型数据格式输出举例,a存储的内容: 1111111111111111 b存储的内容: 1111111111111110 运行结果: a=-1, 177777, ffff, 65535 b=-2, 177776, fffe, 65534,54,2. printf( )函数中实型
26、数据的输出格式符(P79-80),%f :按小数形式输出实数,默认 6位小数。%.nf:按小数形式输出实数,指定保留n位小数。 %m.nf :按小数形式输出实数,指定保留n位小数,数据总宽度至少m位(超过m位时按实际位数)。,例: printf(“%f”, 32.768); 结果: 32.768000 printf(“%f”,-32.768); -32.768000,例: printf(“%.4f”, 32.768); 结果: 32.7680printf(“%.3f”,-32.768); -32.768printf(“%.2f”,-32.768); -32.77,例: printf(“%8.4
27、f”, 32.768); 结果: 32.7680,55,%e(=%E):按规格化指数形式输出实数,尾数部分默认小数点前1位非零数字、小数点后5位小数,指数部分默认1位符号、2位整数。%m.ne (=%m.nE) :按指数形式输出实数,指定尾数部分保留n位有效数字,数据总宽度至少m列。%g (=%G) :按%f (去掉小数点后多余的零)和%e中较短的一种格式输出实数。,例: printf(“%e”, 32.768662); 结果:3.27687e+01,例:printf(“%8.2en“,32.768662); 结果: 3.3e+01,56,实型数据输出举例,例4.8(P79)main( ) f
28、loat f =123.456 ;printf (“%f %10f %10.2f %.2f %-10.2fn“,f,f,f,f,f );printf (“%e , %gn“,f,f ); 运行结果: 123.456001 123.456001 123.46 123.46 123.46 1.23456e+02 , 123.456,57,例3.4(P47) main() float a,b;a=123456.789e5;b=a+20;printf(“%fn“,a);printf(“%fn“,b); ,实型数据的舍入误差,运行结果:12345678848.00000012345678848.0000
29、00,有效位数7位,58,3.printf( )函数中字符的输出格式符(P77),%c :按字符输出一个字符,但不输出单引号。%mc:按字符输出一个字符,占m位,右对齐。%-mc:按字符输出一个字符,占m位,左对齐。,例: printf(“%c”, a); 结果: a,例: printf(“%3c”, a); 结果: a,例: printf(“%3c”, a); 结果: a,59,%d、 %u、 %o或 %x :将该字符的ASCII码值以十进制有符号、十进制无符号、八进制或十六进制形式输出。,例: printf(“%d”, a); 结果: 97printf(“%u”, a); 结果: 97pr
30、intf(“%o”, a); 结果: 141printf(“%x”, a); 结果: 61,60,字符输出举例,main( ) char c= a;int i=97;printf(“%c,%dn“,c,c);printf(“%c,%dn“,i ,i); ,运行结果如下:a,97a,97,例4.4(P75),61,例3.7(P51) main() char a,b; 运行结果:A,Ba=a; 65,66b=b; /*或 b=98;可向字符变量赋以整数 */a=a-32;b=b-32;printf(“%c,%cn%d,%dn“,a,b,a,b); 注: 语言允许字符变量参与数值运算,即用字符的AS
31、CII 码参与运算。 大小写字母的ASCII 码相差32,因此运算后把小写字母换成大写字母,字符输出举例,62,%s格式:输出一个字符串。 %ms格式:输出一个字符串,至少占m位(超过m位按实际位数),右对齐,。 %-6s格式:输出一个字符串,至少占6位,左对齐。 %6.4s格式:截取字符串的左端4个字符输出,至少占6位,右对齐。,4.printf( )函数中字符串的输出格式符(P75),例4.5(P78),例:要求输出字符串 CHINA 方法1)printf(“%s“,“CHINA“); 方法2)printf(“CHINA“);,63,逗号在printf函数中,main() int c=5;printf(“%d,%d,%dn“,c+=2,c+8,+c);c=5;printf(“%dn“,c+=2,c+8,+c);,注意:printf函数中的逗号只是分隔符printf函数中出现多个表达式输出项时,先按从右到左的顺序计算各表达式的值,然后再显示结果 。,8,14,6 8,