资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二章 基本数据类型及运算,数据描述,数据类型,常量,变量,类型转换,运算符与表达式,数据输入与输出,C,数,据,类,型,基本类型,构造类型,指针类型*,空类型,void,自定义类型,typedef,数值类型,字符类型,char,整型,实型,单精度型,float,双精度型,double,短整型,short,长整型,long,整型,int,数组,结构,struct,联合,union,数据类型决定:,1.,数据占内存字节数,2.,数据取值范围,3.,允许的操作,基本数据类型例,类型,符号,关键字,数的表示范围,所占位数,整型,字符型,实型,有,无,(signed),int,16,-3276832767,(signed),short,16,-3276832767,(signed),long,32,-21474836482147483647,16,unsigned,int,065535,32,04294967295,unsigned,long,unsigned,short,16,065535,有,float,32,-3.4e383.4e38,有,double,64,-1.7e3081.7e308,有,char,8,-128127,无,unsigned char,8,0255,需要注意的是,标准,C,没有具体规定以上各整型,数据所占内存字节数。只要求,long,型数据长度不短于,int,型,,short,型不长于,int,型。具体如何实现,由各计算机系统和编译系统决定。,如:在,Visual C+6.0,中,一个,short,型数据占用,2,个字节的内存空间,一个,int,型数据和一个,long,型数据分别占用,4,个字节的内存空间。,一般用大写字母,是宏定义预处理命令,不是,C,语句,直接常量,:,整型常量,实型常量,字符常量,字符串常量,常量,定义:程序运行时其值不能改变的量(即常数),分类,:,符号常量,:,用标识符代表常,定义格式:,#define,符号常量 常量,例 符号常量举例,#define PRICE 30,main(),int num,total;,num=10;,total=num*PRICE;,printf(total=%d,total);,运行结果:,total=300,整型常量(整常数),三种形式:,十进制整数:由数字,09,和正负号表示。如,12,-456,0,八进制整数:由数字,0,开头,后跟数字,07,表示。如,0123,011,十六进制整数:由,0 x,开头,后跟,09,af,AF,表示。如,0 x123,0 xff,例,12,与,12L,例,30000,为,int,型,65536 为,long int,型,整型常量的类型,根据其值所在范围确定其数据类型,常量后加字母,l,或,L,,就成为,long int,型常量,问题:,0123 =(),10,0 x123=(),10,0 xff =(),10,83,291,255,问题:,0123 =(),10,0 x123=(),10,0 xff =(),10,实型常量(实数或浮点数),表示形式:,十进制数形式:(必须有小数点)如,0.123,.123,123.0,0.0,123.,指数形式:(,e,或,E,之前必须有数字;指数必须为整数)如,12.3,e3,123E2,1.23e4,e-5,1.2E-3.5,实型常量的类型,默认,double,型,在,实型常量后加字母,f,或,F,,,为,float,型,在,实型常量后加字母,l,或,L,,,为,long double,型,字符常量,定义:用,单引号,括起来的单个,普通字符,或,转义字符,.,字符常量的,值,:该字符的,ASCII,码,值,=|&,6,条件运算符,?:,7,逗号运算符 ,,8,指针运算符 *,&,9,求字节数运算符,sizeof,10.,分量运算符 ,11,下标运算符,12,其它 如函数调用运算符(),优先级,结合性,15,()-.,左,右,14,!,-,+-&*(,类型名,)sizeof,右,左,13,*,/%,左,右,12,+,-,左,右,11,左,右,10,=,左,右,9,=!=,左,右,8,&,左,右,7,左,右,6,|,左,右,5,&,左,右,4,|,左,右,3,?:,右,左,2,=*=/=+=,=,右,左,1,左,右,注:有些教材最高优先级是,15,,有些最高优先级是,1,。,学习运算符应注意:,(,1,)掌握运算符的功能;,(,2,)搞清运算符与运算量间的关系:,要求运算量个数,要求运算量类型,(,3,)清楚运算的优先级;,(,4,)明确结合方向(在一个运算量的两侧有两个相同优先级别的运算符,则按结合方向顺序处理);,(,5,)明白结果的类型(即表达式的类型)。,算术运算符和表达式,基本算术运算符:,+,-,*/%,结合方向:从左向右,优先级:,-,-,*/%,-,+-,说明:,“,-,”,可为,单目,运算符时,右结合性,两整数相除,结果为整数,“,%,”,要求两侧均为整型数据,例,5/2 =,2,-5/2.0=,-2.5,例,5%2 =,1,-5%2 =,-1,1%10 =,1,5%1 =,0,5.5%2,(,),算术运算符和表达式(续),自增、自减运算符,+-,作用:使变量值加,1,或减,1,种类:,前置,+i,-i (,先执行,i,+1,或,i-1,,,再使用,i,值),后置,i+,i-(,先使用,i,值,,,再执行,i,+1,或,i-1,),例,j=3;k=+j;,j=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)+,+-,结合方向:,自右向左,优先级:-+-*/%-+-,注意,+,、,-,-的副作用,(,p.4849,),例,-,i+,-(i+),i=3;printf(“%d”,-i+);,/*-3*/,j=3;printf(“%d,%d”,j,j+);,/*4,3,or,3,3*/,例,-,i+,?,i=3;printf(“%d”,-i+);,j=3;printf(“%d,%d”,j,j+);,算术运算符和表达式(续),位运算符,位运算是以二进制位,(bit),为基本单位进行的运算,语言提供了六种位运算符:,按位取反 单目,&,按位与 双目,|,按位或 双目,按位异或 双目,右移 双目,不同长度的数据进行位运算:,将操作数右端对齐,,左端补零(无符号数),或补符号位(有符号数),按位与运算符,&,0&0=0,;,1&0=0,;,0&1=0,;,1&1=1,用途:,清零,保留某些位,例:,int i;,i,&,0 x00FF /*low byte*/,i,&,0 x8000 /*the most high bit*/,按位或运算符,|,0|0=0,;,1|0=1,;,0|1=1,;,1|1=1,用途:,置,1,取指定位值,例:,int a=9,b=5,c;c=a,|,b;printf(a=%d,b=%d,c=%dn,a,b,c);/*9,5,13*/,按位异或运算符,00=0,;,10=1,;,01=1,;,11=0,用途:,使特定位翻转,交换变量值,不用临时变量,例:,int a,b,t;,t=a;a=b;b=t;/*need temporary variable*/,a+=b;b=a-b;a-=b;/*possibility of overflow*/,a=b;b=a;a=b;,按位取反运算符,0=1,;,1=0,用途:,特定位清零,char c;int i;,c&0 xFD /*1111 1101*/,i&0 xFFFD/*1111 1111 1111 1101*/,考虑移植性,可用:,c&0 x02,i&0 x02 /*2 byte int or 4 byte int*/,左移运算符,功能:,把,左边的运算数的各二进位全部左移若干位,由,右边的数指定移动的位数,高位丢弃,低位补,0,。,用途:,无溢出时,左移,1,位相当于乘,2,,但快得多。,例:,int i=15;/*00001111*/,i,功能:,把,左边的运算数的各二进位全部右移若干位,由,右边的数指定移动的位数。,有符号数右移:,当为正数时,最高位补,0,;而为负数时,符号位为,1,,最高位是补,0,或是补,1,取决于编译系统的规定。,用途:,右移,1,位相当于除以,2,,但快得多。,unsigned char c=241;/*1111 0001*/,c,2;/*0011 1100=60=241/4*/,简单赋值运算符,符号:,=,格式:,变量标识符,=,表达式,作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符,种类,:,+=-=*=/=%=,=&=|=,=,含义:,exp1 op=exp2,exp1=exp1 op exp2,a+=3,a=a+3,x*=y+8,x=x*(y+8),x%=3,x=x%3,例,a=3;,d=func();,c=d+2;,赋值运算符和表达式,说明:,结合方向:,自右向左,优先级:,左侧必须是变量,不能是常量或表达式,赋值转换,规则:使赋值号右边表达式值,自动,转换成其左边变量的类型,错误:,3=x-2*y;,a+b=3;,例,float f;,int i;,i=10;,f=i;,则,f=10.0,例,int i;,i=2.56;,结果,i=2,;,赋值运算符和表达式(续),例,:,a=b=c=5,a=(b=5),a=5+(c=6),a=(b=4)+(c=6),a=(b=10)/(c=2),/*,表达式值为5,a,b,c,值为5,*/,/*b=5,a=5*/,/*,表达式值11,c=6,a=11*/,/*,表达式值10,a=10,b=4,c=6*/,/*,表达式值5,a=5,b=10,c=2*/,赋值表达式的值与变量值相等,且可嵌套,赋值运算符和表达式(续),赋值运算符和表达式(续),赋值类运算符的副作用及限制,语言允许在一个表达式中使用一个以上赋值运算符。,对人的影响和副作用,易造成误解。,.,程序尽可能写得明了易懂一些;,.,加上一些不必要的括号。,对机器的副作用,不定解。,交换律不再适用。,例:,a=12;,a+=a-=a*a;,/*,a=-264,等价于,a=a+(a=a-(a*a),*/,赋值运算时的类型转换,“=”,两侧类型不一致时,要进行类型转换:,整实:截掉小数部分,实(单、双精度)整:数值不变,存为浮点,整,char,:整型低,8,位,char,整型高,8,位,0,或符号位扩展,(,因机器而不同,),long intint,:符号位扩展,intlong int,:,intlong,低,16,位,long intunsigned int,:高位补,0,整型,(,字节数相同的,)unsigned,整型:原样送入。若超过整型表示范围,会出错。,unsigned(,字节数相同的,),非,unsigned,整型:原样送入,符号位也作为有效数值。,Page,36,include,main(),unsigned a;,int b=-1;,a=b;,printf(%un,a);,运行结果:,65535,11 11 11 11 11 11 11 11,11 11 11 11 11 11 11 11,b,a,例:,赋值语句,格式:,赋值表达式;,赋值语句与赋值表达式的区别:,赋值表达式可以包含在其它表达式中,而赋值语句不可。,例:,if(a=b)0)t=a;,不可写为:,if(a=b,;,)0)t=a;,Page,38,形式:,表达式,1,表达式,2,表达式,n,结合性:从左向右,优先级:,最低,逗号表达式,的值:等于表达式,n,的值,用途:,常用于循环,for,语句中,例,a=3*5,a*4,a=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,表达式值20,*/,/*,赋值表达式,表达式值18,,x=18*/,/*,逗号表达式,表达式值18,x=3*/,/*1,2,3*/,/*3,2,3*/,逗号运算符和表达式,计算字节运算符,sizeof,sizeof,是一个单目的编译状态运算符,,可计算出,变量,或,类型,的字节长度。,例:,float f;,printf(,”,%d,”,sizeof(f);,printf(,”,%d,”,sizeof(int);,Turbo C,输出结果为,4,和,2,。,使用,sizeof,可以增强程序的可移植性,使之不受计算机固有的数据类型长度限制。,运算符与表达式小结,运算符优先级和结合性,一般而言,单目运算符优先级较高,赋值运算符优先级低;算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。,表达式,表达式是由运算符连接常量、变量、函数所组成的式子。每个表达式都有一个值和类型。表达式求值按运算符的优先级和结合性所规定的顺序进行。,格式:,putchar(c),参数:,c,为字符常量、变量或表达式,功能:把字符,c,输出到显示器上,返值:正常,返回显示的代码值;出错,返回,EOF(-1),数据输入与输出,C,语言无,I/O,语句,,I/O,操作由函数实现,#,include,一、数据输出,字符输出函数,#include,main(),int c;,char a;,c=65;a=B;,putchar(c);,putchar(n);,putchar(a);,运行结果:,A,B,例:,格式:,printf(,“,格式控制串,”,,输出表,),功能:按指定格式向显示器输出数据,返值:正常,返回输出字节数;出错,返回,EOF(-1),格式输出函数,输出表:要输出的数据(可以没有,多个时以,“,”,分隔),格式控制串:包含两种信息,格式说明:,%,修饰符,格式字符,,用于指定输出格式,普通字符或转义序列:原样输出,格式字符:,d,i,x,X,o,u,c,s,e,E,f,g,G,%,十六进制无符号整数,不带符号十进制整数,十进制整数,指数形式浮点小数,单一字符,字符串,八进制无符号整数,小数形式浮点小数,e,和,f,中较短一种,百分号本身,int a=567;printf(“%d”,a);,int a=255;printf(“%x”,a);,int a=65;printf(“%o”,a);,int a=567;printf(“%u”,a);,char a=65;printf(“%c”,a);,printf(“%s”,“ABC”);,float a=567.789;printf(“%e”,a);,float a=567.789;printf(“%f”,a);,float a=567.789;printf(“%g”,a);,printf(“%”);,567,ff,101,567,A,ABC,5.677890,e+02,567.789000,567.789,%,说明,格式字符除,X E G,外均应用小写,格式字符与输出项个数应相同,按先后顺序一一对应,格式字符与输出项类型不一致时,输出可能出错,例,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,b);,输出结果,:,3 4,a=3,b=4,附加格式说明符(修饰符),.n,对实数,指定小数点后位数,(,四舍五入,),对字符串,指定实际输出位数,修饰符,功 能,m,输出数据域宽,数据长度,hex%xn,c,c);,运行结果:,Enter a character:A,A-hex41,格式输入函数,格式:,scanf(“,格式控制串,”,,地址表,),功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束,返值:正常,返回输入数据个数,地址表:变量的地址,常用取地址运算符,&,格式字符:,d,i,o,x,u,c,s,f,e,例,scanf(“%d”,输入:10,则,a=10,例,scanf(“%x”,输入:11,则,a=17,附加格式说明符(修饰符),l,修饰符,功 能,h,m,*,用于,d,o,x,前,指定输入为,short,型整数,用于,d,o,x,前,指定输入为,long,型整数,用于,e,f,前,指定输入为,double,型实数,指定输入数据宽度,遇空格或不可转换字符则结束,抑制符,指定输入项读入后不赋给变量,例,scanf(“%4d%2d%2d”,输入 19991015,则1999,y,10 m,15 d,例,scanf(“%3d%*4d%f”,输入,12345678765.43,则,123,k,8765.43f,例,scanf(“%2d,%*3d,%2d”,输入,12,345,67,则,12,a,67b,例,scanf(“%3c%2c”,输入,abcde,则,ac1,d c2,输入分隔符的指定,一般以空格、,TAB,或回车键作为分隔符,其它字符做分隔符:格式串中两个格式符间字符,例,scanf(“%d%o%x”,printf(“a=%d,b=%d,c=%dn”,a,b,c);,输入 123 123 123,输出,a=123,b=83,c=291,例,scanf(“%d:%d:%d”,输入,12:30:45,则,12,h,30 m,45 s,例,scanf(“%d,%d”,&a,&b),输入 3,4,则3,a,4 b,例,scanf(“a=%d,b=%d,c=%d”,输入,a=12,b=24,c=36,说明:,用“%,c”,格式符时,空格和转义字符作为有效字符输入,如,scanf(“%c%c%c”,若输入,a,b,c,则,ac1,c2,b c3,输入数据时,遇以下情况认为该数据结束:,遇空格、,TAB,、,回车,遇宽度结束,遇非法输入,如,scanf(“%d%c%f”,若输入1234,a123,o,.26,则 1234,a,a b,123 c,例,int x;,char ch;,scanf(“%d”,ch=getchar();,printf(“x=%d,ch=%dn”,x,ch);,执行:123,输出:,x=123,ch=10,注意输入函数留下的,“,垃圾,”,程序举例,#include,#include,main(),float a,b,c,s,area;,scanf(%f,%f,%f,s=1.,0,/2*(a+b+c);,area=,sqrt,(s*(s-a)*(s-b)*(s-c);,printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn,a,b,c,s);,printf(area=%7.2fn,area);,例:输入三角形边长,求面积,输入:,3,4,6,输出:,a=3.00,b=4.00,c=6.00 s=6.50,area=5.33,文件包含预处理命令,变量定义,输入数据,输出数据,例:从键盘输入大写字母,输出大写和小写字母,#include,main(),char c1,c2;,c1=getchar();,printf(%c,%dn,c1,c1);,c2=c1+32;,printf(%c,%dn,c2,c2);,输入:,A,输出:,A,65,a,97,输入和输出小结,语言中没有提供专门的输入输出语句,所有的输入输出都是由调用标准库函数中的输入输出函数来实现的。,-scanf,和,getchar,函数是输入函数,接收来自键盘的输入数据。,scanf,是格式输入函数,可按指定的格式输入任意类型数据。,getchar,函数是字符输入函数,只能接收单个字符。,-printf,和,putchar,函数是输出函数,向显示器屏幕输出数据。,printf,是格式输出函数,可按指定的格式显示任意类型的数据。,putchar,是字符显示函数,只能显示单个字符。,
展开阅读全文