资源预览内容
第1页 / 共59页
第2页 / 共59页
第3页 / 共59页
第4页 / 共59页
第5页 / 共59页
第6页 / 共59页
第7页 / 共59页
第8页 / 共59页
第9页 / 共59页
第10页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第 三 章 数据类型与表达式3.1 C的数据类型3.2 常量与变量3.3 整型数据3.4 实型数据3.5 字符型数据3.6 变量赋初值3.7 各类数值型数据间的混合运算3.8 算术运算符和算术表达式3.9 赋值运算符和赋值表达式3.10 逗号运算符和逗号表达式3.1 C的数据类型的数据类型数据结构:数据结构:数据的组织形式。C的数据结构是以 数据类型形式出现的。枚举类型构造类型数组类型结构体类型共用体类型整型数据类型基本类型字符型实型(浮点型)单精度型双精度型指针类型空类型 C语言中的数据有常量与变量之分。它们分别属于以上这些类型。3.2 常量与变量常量与变量3.2.1 常量和符号常量常量和符号常量 定义:定义:常量:常量: 在程序运行过程中,其值不能被改变的量。 分类:分类:字面常量(直接常量)字面常量(直接常量):从其字面形式即可判断。如:12、0、-3为整型常量;4.5、-1.24为实型常量;a、 d为字符型常量。符号常量(标识符形式的常量)符号常量(标识符形式的常量):一个标识符代表一个常量。常量例 3.1 符号常量的使用#define PRICE 30main() int num, total; num=10; total=num*PRICE; printf(“total=%d”,total);注意:注意: 符号常量的值在作用域内不能改变;符号常量一经定义,不能再被赋值。如: PRICE=40;是错误的。 符号常量的特点:符号常量的特点: 习惯上,符号常量名用大写,变量名用小写 含义清楚。 在需要改变一个常量时做到“一改全改”。 3.2.2 变量变量 定义:定义:变量:其值可以改变的量,称为变量。一个变量应该有一个名字(变量名),在内存中占据一定的存储单元。在该存储单元中存放变量的值。如图3.1所示。10num变量名变量值存储单元图 3.1 标识符:标识符: 定义:定义: 用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列,称为标识符。简单说,标识符就是一个名字。 规则:规则: a. C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。例:合法的标识符和变量名:例:合法的标识符和变量名:sum,average,_total,Class,Student_name,lotus_1 不合法的标识符和变量名:不合法的标识符和变量名:M.D.John,¥123,#33,3D64,abb. 区分大小写。一般变量名用小写字母表示。例:sum和SUM,class和Class是不同的变量名。c. 建议标识符的长度不要超过8个字符。例:student_number和student_named. 选择变量名和其它标识符时,应做到“见名知意”。例:name,day,total等。(即选有含义的英文单词或其缩写作标识符)。e.在C语言中,要求对所用到的变量作强制定义,即:“先定义,后使用”。 #define PRICE 30main() int num, total; num=10; total=num*PRICE; printf(“total=%d”,total);#define a 30main() int b,c; b=10; c=b*a; printf(“c=%d”,c);3.3 整型数据3.3.1 整型常量的表示方法整型常量的表示方法整型常量就是整常数。整型常量就是整常数。表示方法:表示方法: 十进制整数。如:123,- 456,0。 八进制整数。以0开头的数是八进制数。如:0123表示八进制数123,-011表示八进制数-11。 十六进制整数。以0x开头的数是十六进制数。如0x123,代表十六进制数的123。3.3.2 整型变量 整型数据在内存中的存放形式整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的,一个整型变量在内存中占2个字节。例: int i; i=10;10i(a)0 0 0 0 0 0 0 00 0 0 0 1 0 1 0(b)i在微机中,凡是带符号的数一律用补码表示。 正数补码与原码相同,即最高位为符号位,用“0”表示正,用“1”表示负,其余为数值位。例:求10的原码0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 负数负数的补码表示即为其绝对值的原码按位取反,然后在最低位加1所形成。例:求-10的补码。0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 010的原码1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 11 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0最低位加1得-10的补码取 反 整型变量的分类整型变量的分类根据数值的范围划分 基本整型,以int表示。 短整型,以short int表示,或以short表示。 长整型,以long int表示,或以long表示。 有符号类型有符号类型(signed):存储单元中最高位代表符号位(0为正,1为负),其余为数值位。 无符号类型无符号类型(unsigned):存储单元中全部二进位用来作为数值位。无符号变量只能存放不带符号的数,如:123,4567,而不能存放负数,如:-45,-78。 归纳,可以用以下6种整型变量。 有符号基本整型 signed int 无符号基本整型 unsigned int 有符号短整型 signed short int 无符号短整型 unsigned short int 有符号长整型 signed long int 无符号长整型 unsigned long int 整型变量的定义整型变量的定义 C规定,变量必须“先定义,后使用”,即强制类型定义。对变量的定义,一般是放在一个函数开头的声明部分。例:main( )int a,b,c,d;unsigned u;a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d); 整型数据的溢出整型数据的溢出 一个整型变量只能容纳-3276832767范围内的数,无法表示超过此范围的数。如果一个整型变量的值大于此范围,称之为溢出。例:main()int a,b;a=32767;b=a+1;printf(“a=%d,b=%d”,a,b);运行结果:a=32767,b=-327681 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1a (32767)b (-32768)3.3.3 整型常量的类型整型常量的类型 一个整数,其值在-32768 +32767范围内,认为它是 int型,可以赋值给int型和long int变量。 一个整数,如果其值超过了上述范围,而在 -2147483648 +2147483647范围内,则认为它是长整型,可以将它赋值给一个long int型变量。 如果short int与int型数据在内存中占据的长度相同, 则一个int型的常量同时也是一个short int型常量,可 以赋值给int型或short int型变量。一个整常量后面加一个字u,认为是unsigned型,如10u,在内存中按unsigned int规定的方式存放(即:存储单元中最高位不作为符号位,而用来存储数据)。如果写成-10u,则先将-10转换成其补码65526,然后按无符号数存储。 在一个整常量后面加一个字母l或L,则认为是long int常量。 例:123l,432L,0L等。3.4 实型数据3.4.1 实型常量的表示方法实型常量的表示方法 实数又称浮点数。它有两种表示形式: 十进制小数形式。十进制小数形式。由小数点和数字组成。如:0.123,1.23,.123,123.等。 指数形式。指数形式。如:123103可表示为123e3或123E3 注意:字母e(或E)之前必须有数字,且e(或E)后面的指数必须为整数。如:e3,2.1e3.5,.e3,e等都不是合法的指数形式。a.一般指数形式一般指数形式 例:123.456可表示为: 123.456e0,12.3456e1,1.23456e2,0.l23456e3b. 规范化的指数形式规范化的指数形式 一个实数在用指数形式输出时,是按规范化的指数形式输出的,即:在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。 例:123.456的规范化指数形式: 1.23456e23.4.2 实型变量实型变量 实型数据在内存中的存放形式实型数据在内存中的存放形式 一个实型数据一般在内存中占4个字节(32位)。并按照指数形式存储。例:实数3.14159在内存中的存放形式+.314159124bit8bit符号 +小数部分.314159 指数部分 101 =3.141592.实型变量的分类实型变量的分类分为三类:分为三类: 单精度(float) 双精度 (double)长双精度 (long double)对每个实型变量都应在使用前加以定义对每个实型变量都应在使用前加以定义例:float x,y; double z; long double t;3. 实型数据的舍入误差实型数据的舍入误差例1:main()float a,b;a=123456.789e5;b=a+20;printf(“b=%f”,b);运行结果:b=12345678848.000000理论值:b=a+20=123456789203.4.3 实型常量的类型实型常量的类型1.实型常量在运算时都是按照双精度数来进行。例:定义f为实型变量 f=2.45678*4523.652. 在一个数的后面加字母f或F,则编译系统就会按 单精度来处理。例:定义f为实型变量 f=2.45678f *4523.65f3. 一个实型常量可以赋给一个float型,double型,或long double型变量。根据变量的类型截取实型常量中相应的有效数字。例:float a;a=111111.111 (7位有效)a=111111.1double b;b=111111.111 (全有效)b=111111.1113.5 字符型数据3.5.1 字符型常量字符型常量1.C的字符常量是用单引号括起来的一个字符。如:a、x、D、?、A等,其中A和a是不同的字符常量。2.转义字符 以一个“”开头的字符序列,将反斜杠()后面的字符转换成另外的意义。(p48 表3.3) 如:101代表ASCII码为65的字符“A”。 x41代表哪一个字符?3.5.2 字符变量字符变量 字符型变量用来存放字符常量,一个字符变量只能放一个字符,即:一个字符变量在内存中只占一个字节。字符变量的定义形式:char c1,c2;c1=a;c2=b;3.5.3 字符数据在内存中的存储形式及其字符数据在内存中的存储形式及其使用方法使用方法1. 存储形式存储形式在内存中,字符数据以ASCII码存储。例:char c1,c2; c1=a;c2=b;ASCII码值: a:97,b:989798c1c20110000101100010c1c22. 使用方法使用方法 整型数据与字符型数据可以通用。一个字符型数据既可以字符形式输出,也可以整数形式输出。例:main( )char c1,c2;c1=97;c2=98;printf (“%c, %cn”,c1,c2);printf (“%d, %dn”,c1,c2);运行结果:a, b 97, 98 可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。例:大小写字母的转换main( )char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf (“%c,%c”,c1,c2); 运行结果:A,B 字符数据与整型数据可以互相赋值例:main( )int i;char c;i=a;c=97;printf(“%d, %c”,i, c);运行结果:97,a 某些系统(如Turbo C)将字符变量中的最高位作为符号位,即将字符处理成带符号的整数(signed char)。其取值范围为:-128127,如果使用ASCII码为0127间的字符,用%d输出时,输出一个正整数;如果ASCII为128255,则得到一个负整数。例:main()char c=130;printf(“%d”,c);运行结果:-126 可以将字符变量定义为unsigned char,此时取值范围是0255。3.5.4 字符串常量字符串常量1. 定义:由一对双引号括起来的字符序列。例:“How do you do.”,“CHINA”,“a”2. 不能将一个字符串赋给一个字符变量。例:char c; c=“CHINA”; /*错误*/3. a和“a”的区别?C规定:在每一个字符串的结尾加一个字符串结束标志“0”,系统据此判断字符串是否结束。在内存中:a (1个字符) char c; c=a; /*正确*/a“a” (2个字符) char c; c=“a”; /*错误*/a0“CHINA” (6个字符) printf(“CHINA”);CH IN A0注意:在写字符串时不必加0,它是由系统自动加上 的。4. C中没有专门的字符串变量,如想存放一个字符串,必须使用字符数组,即:用一个字符型数组来存放一个字符串。3.6 变量赋初值1. C允许在定义变量的同时使变量初始化。例:int a=3; float f=3.56; char c=a;2. 可以使被定义变量的一部分赋初值。例:int a,b,c=5;3. 可以对几个变量赋予同一个初值。例:可以写成: int a=3,b=3,c=3; 不能写成:int a=b=c=3;3.7 各类数值型数据间的混合运算 在进行运算时,整型、实型、字符型数据间可以混合运算,但是不同类型的数据要先转换成同一类型,然后才能进行运算。转换规则:转换规则:高低intunsignedlongdoublechar,shortfloat例:int i; float f; double d; long e;计算:10+a+i*f-d/e注意:上述的类型转换是由系统自动进行的,不需要人工转换。3.8 算术运算符和算术表达式算术运算符和算术表达式3.8.1 C运算符简介运算符简介C的运算符有以下几类:的运算符有以下几类: 算术运算符(+ * / %) 关系运算符( = = !=) 逻辑运算符(! & |) 位运算符( | &) 赋值运算符(= += = *= /= %= = &= = |= ) 条件运算符(? :) 逗号运算符(,) 指针运算符(* &) 求字节数运算符(sizeof) 强制类型转换运算符(类型) 如: (int) x; 分量运算符( ) 下标运算符() 其他(如函数调用运算符()3.8.2 算术运算符算术运算符1.基本的算术运算符基本的算术运算符+ (加法运算符或正值运算符。如:3+5,+3)(减法运算符或负值运算符。如:52, 4)* (乘法运算符。如:3*5)/ (除法运算符。如:5/3)% (求余运算符,%两侧均为整型数据。如7%4的 值为3)注意:注意: 两个正整数相除结果为整数,即:保留整数部分,舍去小数部分。如:5/3=1; 如果除数或被除数中有一个为负值,则舍入方向是不固定的。多数机器采取“向零取整”方法。如:-5/3。 如果参加运算的两个数中有一个数为实数,则结果是double型的。2. 算术表达式和运算符的优先级与结合性算术表达式和运算符的优先级与结合性 算术表达式的定义:C算术表达式 用算术运算符和括号将运算对象连接起来 的,符合C语法规则的式子。运算对象包括 常量、变量、函数等。 如:a*b/c-1.5+a 算术运算符的优先级 * / %优先级高,+ 优先级低。在进行运算时,先进行优先级高的运算,后进行优先级低的运算。如:a-b*c 算术运算符的结合性 算术运算符的结合性为“自左至右”(又称“左结合性”),即:运算对象先与左面的运算符结合。如:a+b-c3. 强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。 一般形式:(类型名)(表达式)如:(double)a (int)(x+y) (float)(5%3)说明:说明: 在进行强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例:强制类型转换main()float x; int i; x=3.6; i=(int)x; printf(“x=%f, i=%d”,x,i);结果:x=3.600000, i=3 有两种类型转换: 一种是系统自动进行的类型转换。 如:3+6.5 第二种是强制类型转换,当自动类型转换不能实现目的时,可用此类转换。 如:float x; 则x%3不合法,必须:(int)x%34. 自增运算符和自减运算符自增运算符和自减运算符 作用:自增运算符:使变量的值增1自减运算符:使变量的值减1 类别:+i,- -i (在使用在使用i之前,先使之前,先使i的值加(减)的值加(减)1)i+,i- -(在使用(在使用i之后,使之后,使i的值加(减)的值加(减)1 )例例1:main() int i=3; int j,k; j=+i;/* i=i+1;j=i; */ k=i+; /* k=i;i=i+1; */ printf(“j=%d,k=%d”,j,k); 注意: 自增运算符(+)和自减运算符(-)只能用于变量,不能 用于常量和表达式。 例:i+,5+,(a+b)+ +和-的结合性是“自右至左”。 例:-i+(其中负号运算符与+运算符的优先级相同) -(i+)5. 有关表达式使用中的问题说明有关表达式使用中的问题说明 ANSI C没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。例如:对表达式 a=f1( )+f2( )例:例:i=3 (i+)+(i+)+(i+)=?几种结果:几种结果:3+4+5=12 i=6 3+3+3=9 i=6为了避免在程序中出现这种歧义性,可改为:为了避免在程序中出现这种歧义性,可改为:i=3;a=i+;/* a=i;i=i+1=3+1=4; */b=i+;/* b=i;i=i+1=4+1=5; */c=i+;/* c=i;i=i+1=5+1=6; */d=a+b+c;结果为:结果为:d=a+b+c=3+4+5=12 i=6 C编译系统尽可能多地(自左至右)将若干个字符组成一个运算符。如:i+j (i+)+j 正确 i+(+j) 错误 在调用函数时,实参数的求值顺序,C标准无统一规定。例如:i=3; printf(“%d,%d”,i,i+);结果:有的系统(从左至右求值):3,3 有的系统(从右至左求值):4,3应改为:i=3; j=i+; printf(“%d,%d”,i,j);3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式1.赋值运算符赋值运算符赋值符号“=”:就是赋值运算符。其作用是将一个常量或表达 式的值赋给一个变量。例如:a=3;d=a; c=a+b;2.类型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。(p59自学)3. 复合的赋值运算符复合的赋值运算符定义:在赋值运算符“=”之前加上其它运算符,可以构成复合运算符。C语言规定可以使用10种复合的赋值运算符。即:+= = *= /= %= = &= = |=例如:例如:a+=3 等价于等价于 a=a+3a-=3 等价于等价于 a=a-3a*=3 等价于等价于 a=a*3a/=3 等价于等价于 a=a/3a%=3 等价于等价于 a=a%3x+=y+8 等价于 x=x+(y+8)x-=y+8 等价于 x=x-(y+8)x*=y+8 等价于 x=x*(y+8)x/=y+8 等价于 x=x/(y+8)x%=y+8 等价于 x=x%(y+8)4. 赋值表达式赋值表达式 定义:用赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。 一般形式: 例如:a=7 d=a z=x+y 表达式的求解过程: 将赋值运算符右侧的“表达式”的值赋给左侧的变量,赋值表达式的值就是被赋值的变量的值。例如:a=5 b=3 c=a+b 赋值运算符按照“自右而左”的结合顺序。例如: a=b=c=5 (c=5 b=c a=b) a=5+(c=6) (c=6 a=5+c) a=(b=4)+(c=6) a=(b=10)/(c=2) 赋值表达式也可以包含复合的赋值运算符。例如:a+=a-=a*a (a的初值为12) a-=a*a (a=a-a*a=12-144= -132) a+=-132 (a=a+(-132)= -264) 赋值表达式可以出现在其它语句中(如:输出语句,循环语句)例如:printf(“%d”,a=b); (b的初值为3) 结果:33.10 逗号运算符和逗号表达式逗号运算符和逗号表达式1.逗号运算符逗号运算符 逗号运算符“,”:又称“顺序求值运算符”。2. 逗号表达式逗号表达式 用逗号运算符将两个表达式连接起来,称为逗号表达式。例如:3+5,6+83. 一般形式一般形式 表达式1,表达式24. 求解过程求解过程 先求解表达式1,再求解表达式2,整个逗号表达式的值是表达式2的值。 如:3+5,6+8 值为14 a=3*5,a*4(赋值运算符的级别高于逗号运算符)结果?5. 一个逗号表达式又可以与另一个表达式组成一个新一个逗号表达式又可以与另一个表达式组成一个新 的逗号表达式。的逗号表达式。 例如:(a=3*5,a*4),a+5 的值是206. 逗号表达式的一般形式可以扩展为:逗号表达式的一般形式可以扩展为: 表达式表达式1,表达式,表达式2,表达式,表达式3,表达式,表达式n 整个表达式的值为表达式整个表达式的值为表达式n的值。的值。 例如:4+5,6+7,8+9的值为177. 逗号运算符的级别在所有运算符中是最低的。逗号运算符的级别在所有运算符中是最低的。例如:x=(a=3,6*3) x=a=3,6*a8. 在许多情况下,使用逗号表达式的目的只是想分别在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值。个逗号表达式的值。如:for(i=1,j=1;i=10,j=10;i+,j+)9. 并不是任何地方出现的逗号都是作为逗号运算符。并不是任何地方出现的逗号都是作为逗号运算符。例如:printf(“%d,%d,%d”,a,b,c); 其中:a,b,c不是一个逗号表达式,a,b,c是printf函数的三个参数,逗号作为参数的分隔符。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号