资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,2,章 基本数据类型、,运算符与表达式,程序是解决某种问题的一组指令的有序集合。,著名计算机科学家沃思(,Nikiklaus,Wirth,)提出一个公式:,程序,=,数据结构,+,算法,程序是什么?,对数据的描述。,在,C,语言中,体现为,数据类型,的描述!,对数据处理的描述。,是为解决一个问题而采取的方法和步骤,是程序的灵魂!,结论:学好,C,语言首先就必须十分了解,C,语言的数据类型、与算符与表达式。,掌握变量和常量的概念;,理解各种类型的数据在内存中的存放形式;,掌握各种类型数据的常量的使用方法;,掌握各种整型、字符型、浮点型变量的定义和引用方法;,了解调用,printf,函数输出各种类型数据的方法;,掌握数据类型转换的规则以及强制数据类型转换的方法;,掌握赋值运算符、算术运算符、位运算符、逗号运算符以及,sizeof,的使用方法;,理解运算符的优先级和结合性的概念,记住所学的各种运算符的优先级关系和结合性。,学习目标,2.1,C,语言数据类型,C,数,据,类,型,基本类型,构造类型,指针类型,空类型,void,定义类型,typedef,字符类型,char,枚举类型,enum,整 型,实型,单精度型,float,双精度型,double,数组,结构体,struct,共用体,union,短整型,short,长整型,long,整型,int,数据类型决定:,1.,数据占内存字节数,2.,数据取值范围,3.,其上可进行的操作,本章所介绍的数据类型,2.2,常量、变量和标识符,1.,标识符,定义:,用来标识变量、常量、函数等的字符序列,组成,:,只能由,字母,、,数字,、,下划线,组成,且第一个字母必须是字母或下划线,C,语言的关键字不能用作变量名,大小写敏感,长度,:有效长,度为,3,2,个字符,。随系统而异,但至少前,8,个字符有效,命名原则:,变量名和函数名中的英文字母一般用小写,以增加可读性,见名知意,不宜混淆 如,l,与,I,o,与0,在,TC2.0,及,BC3.1,中,变量名(标识符)的有效长度为个字符,缺省值为,但在,VC,中其长度可达到,255,例:判断下列标识符号合法性,sum Sum M.D.John day Date 3days,student_name#33 lotus_1_2_3,char ab _above$123,M.D.John,3days,#33,char,$123,ab,.,字符非法,数字,3,不可作首字符,#,字符非法,char,是关键字,字符非法,$,不可作首字符,2.2,常量、变量和标识符,2.,常量,定义:,程序运行时其值不能改变的量(即常数),常量的分类,:,直接常量,(,值常量,),整型常量,:,10,、,15,、,-10,、,-30,实型常量:,12.5,、,30.0,、,-1.5,字符常量,:,A,、,b,、,c,字符串常量,:,“sum”,、“,A”,、“,123”,符号常量,用标识符来代表常量。,其定义格式为:,#,define,符号常量 常量,#define NUM 20,#define PI 3.1415926,#include ,#define PRICE 30,void main(),int,num,total;,num=10;,total=num*,PRICE,;,printf,(total=%d,total);,运行结果:,total=300,行尾不能有分号,define,前面一定要有,#,符号常量名最好使用大写,符号常量名最好有意义,2.2,常量、变量和标识符,3.,变量,定义:,程序运行时其值可以被改变的量,变量的两要素,:,变量名、变量值,变量的定义格式,:,变量的初始化:,定义时赋初始值,变量的使用:,先定义,后赋值,变量定义位置:,一般,放在函数开头,存储类型,数据类型 变量名,1,,变量名,2,,,,变量名,n,;,int,x,y,z;,float radius,length,area;,char,ch,;,决定分配字节数,和数的表示范围,合法标识符,例,:,int,a=2,b,c=4;,float data=3.67;,char,ch,=A;,int,x=1,y=1,z=1;,int,x=y=z=1;,编译程序根据变量定义为其,分配指定字节的内存单元,地址,sh,ort,int,a=1,b=-3,c;,a,b,c,2,字节,2,字节,2,字节,地址,地址,内存,.,.,1,-3,随机数,例,1,:,int,student;,stadent,=19;/,Undefined symbol,statent,in function main,例,2,:,float a,b,c;,c=a%b;/,Illegal use of floating point in function main,void main(),int,a,b=2;,float data;,a=1;,data=(a+b)*1.2;,printf,(“data=%,fn,”,data);,变量定义,可执行语句,void main(),int,a,b=2;,a=1;,float data;,data=(a+b)*1.2;,printf(“data,=%fn”,data);,2.3,简单数据类型与表示范围,1.,整型数据,整型常量,十进制整数:,由数字,0,9,和正负号表示,.,如,:123,-456,0,八进制整数:由数字,0,开头,后跟数字,0,7,表示,.,如,:0123,011,十六进制整数:由,0 x,或,0X,开头,后跟,0,9,a,f,A,F,表示,.,如,0 x123,0Xff,定义整数的符号常量,#define NUM1 20 /,十进制数,20,#define NUM2 020 /,八进制数(十进制,16,),#define NUM3 0 x2a /,十六进制数(十进制,42,),思考题:下列整型常量哪些是非法的?,012,,,oX7A,,,00,,,078,,,0 x5Ac,,,-0 xFFFF,,,0034,,,7B,。,首字符不能是字母,o,八进制数中不能有数字,8,十进制数中不能有字母,B,2.,整数在内存中的表示,整数的数值在内存中用补码的形式存放。,求一个整数补码的方法:,(假设用,n,个二进制位的内存单元来存储它),如果是正整数,,采用符号,-,绝对值表示,即最高有效位(符号位)为,0,表示正,数的其余部分则表示数的绝对值;,如果是负整数,,则先写出与该负数相对应的正数的补码表示,然后将其按位求反,最后在末位(最低位)加,1,;,然后将上述求得的补码的低,n,位存放于内存单元之中,就得到了该整数在内存中的表示,内存单元的最高位是符号位(,0,表示正,,1,表示负)。,在,TC2.0,或,BC3.1,下,一个整数默认情况下需要,2,个字节(,16,位)的内存单元存放;而在,VC6.0,下,则需要,4,个字节(,32,位)。,2.,整数在内存中的表示,十进制整数,14:,对于,16,位的内存单元,:,符号位,(,表示正,),00001110,0,0000000,低字节,高字节,低地址,高地址,符号位,十进制数,+14,两个字节的内存实际存放形式,(+14),补,=,0,000,0000,0000,1110,2.,整数在内存中的表示,十进制整数,14:,对于,32,位的内存单元,:,符号位,(,表示正,),低字节,高字节,低地址,高地址,十进制数,+14,四个字节的内存实际存放形式,(+14),补,=,0,000,0000,0000,0000,0000,0000,0000 1110,00001110,00000000,00000000,0,0000000,符号位,记住:,数据在内存中的存放位置是高字节放在高地址的存储单元中,低字节放在低地址的存储单元中,。,对于负数,14:,对于,16,位的内存单元,:,符号位,(,表示负,),11110010,1,1111111,低字节,高字节,低地址,高地址,符号位,十进制数,-14,两个字节的内存实际存放形式,(+14),补,=,0,000,0000,0000,1110,(-14),补,=,1,111 1111,1111,0010,按位求反,末位加,1,2.,整数在内存中的表示,十进制整数,14:,对于,32,位的内存单元,:,符号位,(,表示负,),低字节,高字节,低地址,高地址,十进制数,-14,四个字节的内存实际存放形式,(+14),补,=,0,000,0000,0000,0000,0000,0000,0000 1110,11110010,11111111,11111111,1,1111111,符号位,(-14),补,=,1,111,1111,1111,1111,1111,1111,1111,0010,按位求反,末位加,1,2.,整数在内存中的表示,对于较大的整数,65537:,(,64K,65536,),对于,16,位的内存单元,:,符号位,(,表示负,),(+65537),补,=,0,1 0000,0000,0000,0001,(-65537),补,=,1,0 1111,1111,1111,1111,按位求反,末位加,1,11111111,1,1111111,低地址,高地址,十进制数,-65537,两个字节的内存实际存放形式,低字节,高字节,符号位,取低,16,位,真值为:,-1,不是,-65537!,2.,整数在内存中的表示,十进制整数,65537:,对于,32,位的内存单元,:,符号位,(,表示负,),低字节,高字节,低地址,高地址,十进制数,-65537,四个字节的内存实际存放形式,(+65537),补,=,0,000,0000,0000,0001 0000,0000,0000,0001,11111111,11111111,11111110,1,1111111,符号位,表示负,(-65537),补,=,1,111,1111,1111,1110 1111,1111,1111,1111,按位求反,末位加,1,真值为:,-65537!,为什么,-65537,这个数在,16,位内存单元中的表示与在,32,位内存单元中的表示不相同呢?,这主要是因为,-65537,这个数超出了,16,位内存单元表示数的范围,,所以实际存储的值(,-1,)与要表示的值(,-65537,)不同,但,-32767,并没有超出了,32,位内存单元表示数的范围,所以实际存储的值就是其本身。因此,我们在,C,语言中对数据处理时必须要注意数据的表示范围,以免引起不必要的错误,。,2.,整数在内存中的表示,八进制整数,034:,对于,16,位的内存单元,:,034=(011 100),2,符号位,(,表示正,),00011100,0,0000000,低字节,高字节,低地址,高地址,符号位,八进制数,034,两个字节的内存实际存放形式,(034),补,=,0,000,0000,0001 1100,对于,32,位的内存单元,:,(034),补,=,0,000,0000,0000,0000,0000,0000,0001 1100,符号位,(,表示正,),低字节,高字节,低地址,高地址,八进制数,034,四个字节的内存实际存放形式,00011100,00000000,00000000,0,0000000,符号位,2.,整数在内存中的表示,八进制整数,034:,对于,16,位的内存单元,:,符号位,(,表示负,),11100100,1,1111111,低字节,高字节,低地址,高地址,符号位,八进制数,-034,两个字节的内存实际存放形式,(+034),补,=,0,000,0000,0001 1100,(-034),补,=,1,111 1111 1110 0100,按位求反,末位加,1,对于,32,位的内存单元,:,(+034),补,=,0,000,0000,0000,0000,0000,0000,0001 1100,按位求反,末位加,1,(-034),补,=,1,111,1111,1111,1111,1111,1111,1110 0100,符号位,(,表示负,),11100100,11111111,11111111,1,1111111,低字节,高字节,低地址,高地址,八进制数,-034,四个字节的内存实际存放形式,符号位,2.,整数在内存中的表示,十六进制整数,0X8AB6:,对于,16,位的内存单元,:,0X8AB6=(1000 1010 1011 0110),2,符号位,(,表示正,),10110110,1,0001010,低字节,高字节,低地址,高地址,符号位,表示负,十六进制数,0X8AB6,两个字节的内存实际存放形式,(0X8AB6),补,=,0,1000 1010 1011 0110,取低,16,位,真值为:,-30026!,对于,32,位的内存单元,:,(0X8AB6),补,=,0,000,0000,0000,0000,1000 1010 1011 0110,符号位,(,表示正,),10110110,10001010,00000000,0,0000000,低字节,高字节,十六进制数,0X8AB6,四个字节的内存实际存放形式,低地址,高地址,符号位,真值为:,+35510!,2.,整数在内存中的表示,十六进制整数,0X8AB6:,对于,16,位的内存单元,:,符号位,(,表示负,),(+0X8AB6),补,=,0,1000 1010 1011 0110,(-0X8AB6),补,=,1,0111 0101 0100 1010,按位求反,末位加,1,01001010,0,1110101,低地址,高地址,十六进制数,-0X8AB6,两个字节的内存实际存放形式,低字节,高字节,符号位,表示正,取低,16,位,真值为:,+30026!,对于,32,位的内存单元,:,(+0X8AB6),补,=,0,000,0000,0000,0000,1000 1010 1011 0110,按位求反,末位加,1,(-0X8AB6),补,=,1,111,1111,1111,1111,0111 0101 0100 1010,符号位,(,表示负,),01001010,01110101,11111111,1,1111111,低字节,高字节,十六进制数,-0X8AB6,四个字节的内存实际存放形式,低地址,高地址,符号位,表示负,真值为:,-35510!,3.,整型变量,整型变量的定义,int,变量名,,变量名,2,,,,,变量名,n,;,int,必须小写,至少一个空格,必须为合法的标识符,以逗号,分隔,以分号,;,结尾,定义时可以赋初值,方法:在变量名后面增加“,=,数值”,例:,int,a;,int,x,y,z;,int,m=2,y=-3;,当程序中定义了一个变量时,计算机会为这个变量分配一个相应大小的内存单元。因此,这个变量是有值的,它的值就是对应内存单元的值。如果定义时没有赋初值,则这个值程序员是无法预知的。,整型变量的分类,修饰符,控制变量是否有符号:,signed,(有符号)和,unsigned,(无符号),控制整型变量的值域范围:,short,(短)和,long,(长)。,有符号基本型(,int,),int,a=-2;,/,定义一个有符号整型变量,a,,并赋初值,-2,占一个机器字大小的内存单元。,TC,或,BC3.1,下,变量占,2,个字节(,16,位)的内存单元;,VC6.0,下,变量占,4,个字节(,32,位)的内存单元。,如果定义变量时,不指定,signed,,也不指定,unsigned,,则默认为,signed,(有符号),11111110,1,1111111,低地址,高地址,低字节,高字节,符号位,变量,a,占用的内存单元,(2,字节,),有符号整型变量在内存中的实际存放形式,(,假设在,BC3.1,下,),无符号基本型(,unsigned,int,或,unsigned,),unsigned,int,a=2;,/,定义一个无符号整型变量,a,,并赋初值,2,或,unsigned a=2;,占用的内存单元字节数同,int,类型。与,int,a=2;,等价。,unsigned,int,a=-2;,/,定义一个无符号整型变量,a,,并赋初值,-2,或,unsigned a=-2;,11111110,1,1111111,无符号整型变量在内存中的实际存放形式,(,假设在,BC3.1,下,),低字节,高字节,低地址,高地址,数据位,变量,a,占用的内存单元,(2,字节,),其值为:,65534!,注意:,对于有符号数也好还是无符号数也好,其实在计算机内存中表示是不加区分的,都是以其补码形式表示,只是我们怎样看待最高二进制位的问题,如果把最高位当成符号位看待,则为有符号数,如果把最高位当成数据位看待,则变为无符号数。,例如:,unsigned,int,a=-2,;,printf(“%d,”,,,a),;,-,有符号输出,则为,-2,printf(“%u,”,,,a),;,-,无符号输出,则为,65534,有符号短整型(,short,int,或,short,),short,int,a=2;,/,定义一个有符号短整型变量,a,,并赋初值,2,或,short a=2;,占用的内存单元为,2,个字节,无论是,TC,、,BC,,还是,VC,。,无符号短整型(,unsigned short,int,或,unsigned short,),unsigned short,int,a=2;,/,定义一个无符号短整型变量,a,,并赋初值,2,或,unsigned short a=2;,占用的内存单元字节数同,short,类型。,在,TC2.0,和,BC3.1,下,,unsigned short,类型与,unsigned,int,类型是等价的,。,有符号长整型(,long,int,或,long,),long,int,a=234567;,/,定义一个有符号长整型变量,a,,并赋初值,234567,或,long a=234567;,占用的内存单元为,4,个字节,无论是,TC,、,BC,,还是,VC,。,无符号长整型(,unsigned long,int,或,unsigned long,),unsigned long,int,a=2;,/,定义一个无符号长整型变量,a,,并赋初值,2,或,unsigned long a=2;,占用的内存单元字节数同,long,类型。,在,VC,中,long,与,int,类型基本相同,均占四个字节的内存单元;但在,TC,或,BC,中,,long,类型与,int,类型只是所占字节不同外(,long,占,4,字节,,int,占,2,字节),其它数据处理方法是一样的。,【,例,】,各种整型变量的定义,#include ,#define SUM 65535,void main(),int,a,b=20,;,unsigned,int,c=0 xff;,long D;,a=SUM;,D=301;,printf(a,=%,dn,a),;,printf(b,=%,dn,b),;,printf(c,=%,dn,c),;,printf(“D,=%,dn,”,D),;,/,文件包含,头文件说明,/,定义符号常量,SUM,,值为,65535,/,定义两个,int,型变量,a,和,b,,,b,赋初值,20,/,定义无符号整型变量,c,,并赋初值,0 xff,/,定义长整型变量,D,/,对,a,赋值为,SUM,,这时,a,的值是,65535,/,对,D,赋值为,301,/,以有符号十进制形式(,%d,)显示,a,的值,/,以有符号十进制形式(,“,%d”,)显示,b,的值,/,以有符号十进制形式(,%d,)显示,c,的值,/,以有符号十进制形式(,%d,)显示,D,的值,变量定义部分,语句执行部分,在,BC3.1,下运行结果:,a=-1,b=20,c=255,D=301,在,VC6.0,下运行结果:,a=65535,b=20,c=255,D=301,对于,16,位的有符号整型变量,a,来说,因,65535,在内存中的形式为,1,111111111111111,,最高位为,1,表示负,则其所对应的十进制数就为,-1,。,4.,整数常量的分类,根据其值所在范围确定其数据类型,。在,TC2.0,或,BC3.1,下,如果整型常量的值位于,-32768,32767,之间,,C,语言认为它是,int,型常量;如果整型常量的值位于,-2147483648,2147483647,之间,,C,语言认为它是,long,型常量。,整型常量后加字母,l,或,L,,认为它是,long,int,型常量,。比如,123L,、,45l,、,0XAFL,。,无符号数也可用后缀表示,整型常数的无符号数的后缀为,U,或,u,。,例如:,358u,,,0 x38Au,,,235Lu,均为无符号数。,前缀、后缀可同时使用以表示各种类型的数。如,0XA5Lu,表示十六进制无符号长整数,A5,,其十进制为,165,。其实整型常数这种表示无符号数意义不大,在机器内部它还是用其补码表示,例如,-1U,和,-1,在内存中表示是一样的,数据处理也一样,所以有的教科书上说“常量无,unsigned,类型”,其实有,但无意义。,5.,实型数据,实型常量(实数或浮点数),十进制小数形式:,由数字,0,9,和小数点组成,.,如,:0.0,5.6,-5.,指数形式:由十进制数,加阶码标志,e,或,E,以及阶码(只能为整数,可以带符号)组成,.,其一般形式为:,aEn,其中:,a,为十进制数,,n,为十进制整数,都不可缺少。其可表示为,a,10,n,合法的实数表示:,2.1E5,表示,2.110,5,,,3.7E-2,表示,3.710,-2,。,非法的实数表示:,345,(,无小数点,),,,E7,(,阶码标志,E,之前无数字,),,,-5,(,无阶码标志,),,,50.-E3,(,负号位置不对,),实型变量,单精度实型(,float,),float f=3.14,g;,这种定义的变量在内存中占,4,个字节(,32,位)的存储单元。,双精度实型,(,double,),double x,y;,这种定义的变量在内存中占,8,个字节(,64,位)的存储单元。,长双精度实型,(,long double,),long double x,y;,在,TC,或,BC,下,这种定义的变量在内存中占,10,个字节(,80,位)的存储单元;在,VC,下则占,8,个字节(,64,位)。,注意:,三种实数类型中,其精度是,float double,long double,;,long float,实际上就是,double,因此,没有,long float,类型;,所有的实型常量按照,double,类型处理。,5.,实型数据,实型数据的精度,类 型,精确表示的数字个数,float,7,8,double,16,17,long double,17,18,#include,void main(),float a;,/,定义,float,型变量,a,double b,c;,/,定义,double,型变量,b,和,c,a=123.456789;,/,对变量,a,赋值为,123.456789,b=a;,/,将变量,a,赋给变量,b,c=123.456789;,/,对变量,c,赋值为,123.456789,printf(a,=%f b=%lf c=%lfn,a,b,c);,a,b,c,123.45678,7,123.456787,123.456789,a=123.456787 b=123.456787 c=123.456789,float,型变量最多只能精确表示,8,个数字,因此显示,a,的值时,只能有效显示前面,8,个数字即,123.45678,,最后追加一位数字,7,是随机的,6.,字符型数据和字符串常量,字符型常量,定义:,用,单引号,括起来的单个,普通字符,或,转义字符,.,如 ,a A?n 101,字符常量的值:,该字符的,ASCII,码,值,如,A65,,,a97,,,048,n10,转义字符:,反斜线后面跟一个字符或一个代码值表示,转义字符及其含义:,转义字符,含义,n,v,r,a,ddd,t,b,f,“,xhh,转义字符,含义,换行,垂直制表,回车,响铃,单引号,3,位,8,进制数代表的字符,水平制表,退格,换页,反斜线,双引号,2,位,16,进制数代表的字符,如 ,101 -A 012 -n,376 -,x61 -a,60 -0 483 -(,),例,:,A-101-x41-65,例:转义字符举例,#include,void main(),printf,(101 x42 Cn);,printf,(I say:How are you?n);,printf,(C Programn);,printf,(Visual C);,运行结果:,(,屏幕显示,),A B C,I,say:”How,are you?”,C Program,Visual C,例,:,void main(),printf(“Yb,=n”);,运行结果:,屏幕显示:,=,打印机输出:,字符串常量,定义:,用双引号,(“”),括起来的字符序列,存储:,每个字符串尾,自动,加一个 0 作为字符串结束标志,例,1:,字符串“,HELLO”,在内存中,0 x48,0 x45,0 x4C,0 x4C,0 x4F,0,低地址,高地址,H,E,L,L,O,0,字符串结束标志,例,2:,空串,“”,0,字符常量与字符串常量不同,0 x41,0 x41 0,例,A,“,A”,例,:char,ch,;,ch,=“A”;,例,:char,ch,;,ch,=A;,字符型变量,字符型数据类型符是,char,(字符,character,),在内存中占,1,个字节(,8,位),字符变量存放字符,ASCII,码,char,与,int,数据间可进行算术运算,存在有符号和无符号之分。默认情况下为有符号,例:,char,ch,;,unsigned char C=B;,例:,a=D;,/a=68;,x=A+5;,/x=65+5;,s=!+G,/s=33+71;,没有,字符串变量,,用字符数组存放,7.,简单数据类型的表示范围,0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1,最大值:,+32767,1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,最小值:,-32768,int,符号位,十六位整型数所表示的数据范围,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1,最大值:,65535,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,最小值:,0,unsigned,int,数据位,类型,符号,关键字,占字节数,数的表示范围,整,型,有,(,signed,),int,在,16,位系统下,2,-32768,32767,在,32,位系统下,4,-2147483648,2147483647,(,signed,),short,2,-32768,32767,(,signed,),long,4,-2147483648,2147483647,无,unsigned,int,在,16,位系统下,2,0,65535,在,32,位系统下,4,0,4294967295,unsigned short,2,0,65535,unsigned long,4,0,4294967295,实,型,有,float,4,绝对值,10,-37,10,38,有,double,8,绝对值,10,-307,10,308,有,long double,10,绝对值,10,-4931,10,4932,字符型,有,char,1,-128,127,无,unsigned char,1,0,255,【,例,】,变量的存储范围,#include,void main(),char,ch,;,int,x;,ch,=80+50;,x=80+50;,printf,(,ch,=%,dn,ch,);,printf,(x=%,dn,x);,ch,=-126,x=130,为什么,?,十进制数 对应的机器数(补码),80,0,0 0 0,0 0 0 0 0 1 0 1 0 0 0 0,ch,+,50,0,0 0 0,0 0 0 0 0,0 1 1 0 0 1 0,0,0 0 0,0 0 0 0 1,0 0 0 0 0 1 0,1 0 0 0 0 0 1 0,符号位,真值:,-126,8.,简单的数据输出,C,语言中没有用于输出的语句,只能通过标准库函数的调用来完成数据的输出任务。库函数的一般调用格式为:,函数名(参数,1,,参数,2,,,,参数,n,);,printf,函数:,printf,(,variable a=%d,,,a,);,参数,1,(,字符串常量,),函数名,参数,2,(,变量,),逗号隔开,分号结束,例:,printf,(,How are you,!,);,输出:,How are you,!,例:,int,a=100,;,printf,(,variable a=%d,,,a,);,输出:,variable a=100,%d,:,用于显示有符号整型数据,如,int,、,short,型数据;,%u,:,用于显示无符号整型数据,如,unsigned,int,、,unsigned short,型数据;,%f,:,用于显示实型数据,如,float,型数据;,%c,:,用于显示字符型数据,如,char,型数据;,%s,:,用于显示字符串数据。,格式控制符,例:简单的数据输出,#include,void main(),int,a,b;,unsigned,int,u;,long L;,char,ch,;,float f;,a=200;,b=-1;,u=b;,L=u;,ch,=A;,f=32.17;,printf(a,=%,dt,a,);,printf(b,=%,dn,b,);,printf(u,=%,ut,u,);,printf(L,=%ld,n,L,);,printf(f,=%,fn,f,);,printf(ch,is%c and value is%,dn,ch,ch,);,printf(I,love C language!,rYoun,);,/I,后有三个空格,在,VC,下:,a=200 b=-1,u=4294967295 L=-1,f=32.169998,ch,is A and value is 65,You love C language!,在,BC,下:,a=200 b=-1,u=65535 L=65535,f=32.169998,ch,is A and value is 65,You love C language,!,b,的值是,-1,,在内存中表示为:,0 xffff,(,BC,下),,0 xffffffff,(,VC,下),当它赋给,u,时,由于,u,是无符号数,因此,u,的值是,65535,(,BC,下),,4294967295,(,VC,下)。,L,是有符号长整型,,u,是无符号整型。在,BC,下,,L,占,4,字节,,u,占,2,字节,当把,u,赋值给,L,时,,L,的高,2,个字节为全,0,(因,u,无符号),故,L,的值为,0 x0000ffff,,即,65535,。但在,VC,下,L,和,u,都占,4,字节,当把,u,赋值给,L,时,,L,的值为,0 xffffffff,,即,-1,。,2.4,C,语言的运算符与表达式,变量用来存放数据,运算符则用来处理数据。用运算符将变量和常量连接起来的符合,C,语法规则的式子被称为,表达式。,运算符的分类:,单目运算符:只带一个操作数的运算符。如:,+,、,-,运算符。,双目运算符:带两个操作数的运算符。如:,+,、,-,运算符。,三目运算符:带三个操作数的运算符。如:,?,运算符。,学习运算符时应注意:,运算符的功能:该运算符主要用于做什么运算。,与运算量关系:要求运算量的个数及运算量的类型。,运算符的优先级:表达式中包含多个不同运算符时运算符运算的先后次序。,运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结合性)。,运算结果的类型:表达式运算后最终所得到的值的类型。,C,运,算,符,算术运算符:(,+-*/%+-,),关系运算符:(,=!=,),逻辑运算符:(!,&|,),位运算符 :(,|&,),赋值运算符:(,=,及其扩展),条件运算符:(,?:,),逗号运算符:(,),指针运算符:(*,&,),求字节数 :(,sizeof,),强制类型转换:(类型),分量运算符:(,.-,),下标运算符:(,),其它 :(,()-,),1.,赋值运算符、赋值表达式,赋值运算符,(“,”,双目运算符),一般形式:,变量,=,常量或变量或表达式,功能:,将右边常量或变量或表达式的值赋给左边变量,例如:,int,x,y,z;,x=20;,y=x;,z=x+y;,赋值表达式,定义:,由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一个表达式连接起来的表达式,称为,赋值表达式,。,一般格式:,变量 (复合)赋值运算符 表达式,赋值表达式的值:,被赋值变量的值。,例如:,“,a=5”,这个赋值表达式,变量,a,的值“”就是它的值。,赋值语句,例如:,x=8;a=b=c=5,;,定义:,赋值表达式在其后面加分号就构成了,赋值语句,。,赋值运算符及赋值表达式的使用,多个变量连续赋值,例如:,a=b=c=10,;,a=(b=(c=10),;,结果:,a,、,b,、,c,的值都为,10,赋值表达式的嵌套,例如:,a=(b=2)+(c=3),(a=(b=2)+(c=3),结果:,b,为,2,,,c,为,3,,,a,为,b+c,即,5,注意:,赋值语句“,=”,左边必须是变量名或对应某特定内存单元的表达式,(后面的章节会遇到这样的表达式),不能是常量或其它表达式。,例如:,30=a;b+2=5;,都是错误的。,赋值语句中的“,=”,表示赋值,不是代数中相等的意思。,要表示相等的意思则应用关系运算符“,=”,表示,二者切勿混淆!,2.,强制类型转换符,C,语言的数据类型是可以相互转换的。转换的方法有两种:一种是,自动转换,,一种是,强制转换,。,自动转换,例如:,int,a=2.5;,则,a,的值将是,2,而,不是,2.5,。,这种自动改变等号右边表达式值的数据类型的操作称为数据类型的,自动转换。,首先将等号右边的表达式的值转换成“,=”,左边的数据类型。然后再赋值给等号左边的变量,。,(1),短长度的数据类型,长长度的数据类型,方法:,直接将无符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,长长度的数据类型数据的高位部分补零。,无符号短长度的数据类型,无符号或有符号长长度的数据类型,xxx,无符号短长度的数据类型,长长度的数据类型,xxx,0,0,.,.,.,.,.,0,.,.,.,.,.,高位部分补,0,例如:,unsigned char,ch,=0 xfc;,unsigned,int,a=0 xff00;,/,假设,int,数据为,16,位,int,b;,unsigned long u;,b=,ch,;,/b,的值将是,0 x00fc,u=a;,/u,的值将是,0 x0000ff00,如果将,ch,的值赋给,-4,问,b,的值又是多少呢?,0 x00fc,2.,强制类型转换符,自动转换,(1),短长度的数据类型,长长度的数据类型,方法:,直接将有符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据的符号位)向长长度的数据类型数据的高位部分扩展。,有符号短长度的数据类型,无符号或有符号长长度的数据类型,z,x,x,有符号短长度的数据类型,长长度的数据类型,z,x,x,z,符号位向高位部
展开阅读全文