1第三章数据类型、运算符和表达式23.1C语言数据类型3.1.1C语言数据类型整型字符型实型(浮点型)枚举类型数组结构体类型共用体类型单精度型双精度型基本类型构造类型指针类型空类型数据类型33.2常量与变量3.2.1常量1.定义:在程序执行期间,其值不可改变的量称为常量2.类型:•数值常量例如:10,3,2.68等•符号常量即用一个符号代表一个常量•例如:#definePRICE30•main(){•intnum,total;•num=10,•total=num*PRICE;•printf(“total=%d”,total);•}4说明:•符号常量必须先定义后才能用它表示一个数值。•符号常量的值在其作用域内不能改变,也不能再被赋值。•符号常量名习惯用大写字母表示。5符号变量的好处(1)含义清楚。定义符号常量名时应考虑“见名知意”。(2)在需要改变一个常量时能做到“一改全改”。63.2.2变量1.定义:程序执行期间值可以改变的量。2.命名规则:变量名由标识符表示,只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。例如:M.D.John,%gf,add,_ce36,age&,5thclass,lotus-1-2-3,cd*ef,float注意,C语言区分大小写,大写字母和小写字母被认为是两个不同的字符。因此,sum和SUM,Class和class是两个不同的变量名。3.变量要“先定义,后使用”定义格式:类型说明符标识符1,…,标识符n例如:intx,y,z;(每个变量分配2个字节)floata,b,c,d;(每个变量分配4个字节)7在C语言中,变量必须强制定义,其目的:1、凡未被事先定义的,不作为变量名。2、每一个变量被指定为一确定的类型,在编译时就能为其分配相应的存储单元。3、指定每一个变量为一确定的类型,在编译时据此检查该变量所进行的运算是否合法。83.3整型数据3.3.1整型常量的表示法十进制整数:由数字(0-9)和正负号表示例如:123、-456、0等023不合法的十进制整数八进制整数:以0开头数是八进制数例如:0123即(123)8=(83)10(123)8=182+281+380=(83)10十六进制整数:以0x或0X开头,例如:0x123即(123)16=(291)10-0x12即(-12)16=(-18)1093.3.2整型变量1.整型数据在内存中的存放形式(补码表示法:便于加减运算)inti;i=10;10=(1010)22102522210余数0101首位000000000000101000000000000010101111111111110101111111111111011010的原码取反取反后再加1,得-10的补码10的表示法,正数的补码等于它的原码-10102整型变量的分类基本型:以int表示短整型:以shortint或short表示1.类型长整型:以longint或long表示(123l、123L)无符号基本型(unsignedint)无符号型无符号短整型(unsignedshort)无符号长整型(unsignedlong)(-32768~32767)一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。inta;/*变量a的数值范围:-32768~32767*/unsignedintb;/*变量b的数值范围:0~65535*/1112•整型变量的字长•short型∶字长16位(2个字节)。•long型∶字长32位(4个字节)。•int型∶随编译程序而定(可以是2个字节,也可以是4个字节)•C要求long型数据长度不短于int型,•short型不长于int型。(short=int=long)•long型可以得到大范围的数据,但同时会降低运算速度,因此除非不得已,不要随便使用long型。13整型数据的溢出:main(){inta,b;a=32767;b=a+1;printf(“”%d,%d”,a,b);运行结果:32767,-32768改进:将变量a和b改成long型,并按%ld格式输出。14整型常量数据的数据范围请看P43表。注意:1、在一个整数常量后面加一个字母l或L,则认为是long型常量。2、在一个整数常量后面加一个字母u或U,则认为是unsignedint型常量。153.4实型数据3.4.1实型常量表示形式有如下两种:十进制数形式:由数字和小数点及正负号组成。(注意:必须有小数点)例如:23.678、.678、23.、123.0指数形式:由数字、小数点、字母e或E及正负号组成。(注:e或E之前必须有数字,且后指数必须为整数)例如:3.5E-5、2e3错误:E2、3.6e3.5、.e6、e16一个实数可以有多种指数表示形式。例如123.456可以表示为123.456e0、12.3456el、1.23456e2、0.123456e3、0.0123456e4、0.00123456e5等。把其中的1.23456e2称为“规范化的指数形式”,即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。例如2.3478e2、3.0999E5、6.46832e12都属于规范化的指数形式;而12.908e10、0.4578e3、756e0则不属于规范化的指数形式。(一个实数在用指数形式输出时,是按规范化的指数形式输出的)17一个实型数据一般在内存中占4个字节(32位)。实型数据按照指数形式存储。系统把一个实型数据分成小数部分和指数部分,分别存放小数部分采用规范化的指数方式表示。例如:183.4.2实型变量实型变量可分为:单精度(float型)如:floatx,y;双精度型(double型)如:doublea,b,c;长双精度型(longdouble型)如:longdoubled,e;(longdouble不常用,将不再介绍)说明:1.float型变量在内存中占4个字节;double型变量在内存中占8个字节;longdouble占16个字节。2.单精度实数提供7位有效数字;双精度实数提供15~16位有效数字;长双精度实数提供18~19位有效数字。3.一个实型常量不分float和double型,一个实型常量可以赋给一个float型或double型变量,并根据变量的类型截取实型常量中相应的有效位数字。例如:floata;doubleb;a=123456.789e5;b=123456.789;假如a指定为单精度实型变量:floata;a=111111.111;float型变量只能接收7位有效数字,最后两位小数不起作用。将a改为double型,则能全部接收上述9位数字并存储在变量a中。19main(){floata,c;doubleb;a=123456.789e5;b=123456789111111.789;c=a+20;printf(“a=%f,b=%f,c=%f\n”,a,b,c);}输出结果:a=12345678848.000000,b=123456789111111.781000,c=12345678848.000000(避免将一个很大的数与一个很小的数相加,,以免出现舍入误差)203.5字符型数据3.5.1字符常量1.字符常量:用单引号括起来的一个字符。例如:‘a’‘A’‘$’‘!’注:‘a’与‘A’是的字符常量不同2.转义字符:以一个‘\’开头的字符序列。将反斜杠(\)后面的字符转换成另外的意义。如’\n’中的“n”不代表字母n而作为“换行”符。例如:‘\n’换行‘\t’横向跳格(水平制表)‘\b’退格‘\v’竖向跳格(垂直制表)‘\r’回车‘\f’走纸换页‘\a’报警‘\0’空字符21说明:1、“\ddd”与“\xhh”分别表示用八进制数或十六进制数表示一个字符。例:‘\101’代表ASCII码(十进制)为65的字符‘A’.系统中所有字符都有ASCII值(见374页)ASCII:美国信息交换标准码AmericanStandardCodeforInformationInterchange。2、由于\’”在C语言中都有了特殊的意义,故要想在字符串中使用它们,须在其前面再加上一个反斜线。例如:\\反斜线\’单引号\”双引号3、除了前面介绍的特殊转义字符外,‘\字母’代表字母本身。如‘\c’代表字母c。22判断下列字符串的长度:“\\\’\054”“\x56\”\\\c\ta”“\\\n\t\bab”23243.5.2字符变量定义形式:char标识符1,标识符2,…,标识符n例如:charc1,c2,c3,ch;c1=‘a’;c2=‘b’;c3=‘c’;ch=‘d’;说明:1、字符变量在内存中占一个字节。2、在内存中,是把字符对应的ASCII码值放到存储单元中.3、字符型数据与整型数据之间可以通用.625main(){charc1,c2;c1=97;c2=98;printf(“%c%c\n”,c1,c2);printf(“%d%d\n”,c1,c2);}输出结果:ab9798但是应注意字符数据只占一个字节,它只能存放0—255范围内的整数。main(){inti;charc;i=‘a’;c=97;printf(“%c,%d\n”,c,c);printf(“%c,%d\n”,i,i);}输出结果:a,97a,97263.5.4字符串常量1.定义:括在一对双引号之内的字符序列或转义字符序列称为字符串常量。例如:“Howareyou!”“a”“*abc\n\t”2.存储:字符串中的字符依次存储在内存中一块连续的区域内,并且把空操作字符‘\0’自动附加到字符串的尾部作为字符串的结束标志。故字符个数为n的字符串在内存中应占n+1个字节。例:c=“china”china\027‘b’与“b”是否相同?'b'是字符常量,“b是字符串常量283.6变量赋初值1.初始化:在定义变量的同时为变量赋初值2.形式:类型标识符变量名=常量或常量表达式例如:intx=10;charch=‘a’;•变量赋初值允许使用符号常量例如:#definePI3.1415926…...floatx=PI;…...•可对被定义的变量的一部分赋初值例如:inta,b,c=1,d=2;floatr=2,l,s;•可对几个变量赋以同一个初值例如:inta=6,b=6,c=6;而不能写成:inta=b=c=6;29注意:初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于有一个赋值语句。例如:inta=3;相当于:inta;/*指定a为整型变量*/a=3;/*赋值浯句,将3赋给a*/又如inta,b,c=5相当于:inta,b,c;/*指定a,b、c为整型变量*/c=5;/*将5赋给c*/303.7各类数值型数据间的混合运算一、运算过程:先自动转换成同类数据,再进行运算。二、转换规则:低字长类型转换成高字长类型。double←float↑long↑unsigned↑int←char,short①向左的横向箭头表示即使在同一种数据类型间进行运算时也要进行转换。用于提高精度。②向上纵向箭头表示当运算对象类型不同时的转换方向。31例:若有:inti;floatf;doubled;longe;试判断表达式10+‘a’+i*f-d/e的类型intunsignedintlongintunsignedlongintdoubleshort,charfloatdouble型32C语言使用的基本表达式有:⑴赋值表达式,如:a=3⑵算数表达式,如:3+4*2⑶关系表达式,如:32⑷逻辑表达式,如:35&&a=b⑸条件表达式,如:ab?a:b⑹逗号表达式,如:a=3,b=4,c=5333.8算术运算符和算术表达式1、基本的算术运算符:+-*/%说明:(1)上述运算符均为双目运算符(即有两个操作数)(2)在“/”运算中,若操作数均为整数,则执行整除运算,舍去小数部分。例如:5/3=1(3)“%”要求两侧均为整数,“%”运算不能用于float和double型数据例如:5