C02数据类型与表达式.ppt_第1页
C02数据类型与表达式.ppt_第2页
C02数据类型与表达式.ppt_第3页
C02数据类型与表达式.ppt_第4页
C02数据类型与表达式.ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本章内容 数据类型 数据的分类、表示与存储 运算分量 常量与变量 运算表达式 运算符、表达式 输入输出 标准、字符与流,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,第2章 C程序设计基础,2.1 数据类型 一、数据类型,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,二、基本类型的 标识符与常数形式,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,三、基本类型的存储形式,2.2 常量与变量,一、常量 1、直接常量 直接写在表达式中的常数(字面常量)。 例如:int r,s; r=12; s=3.14*r*r; 整型常量:12 12 12L -12l 027 -027 -027L 0X8A -0x8aL 实型常量:3.14 -3.14L 0.314e1 314e-2 字符常量(含转义符):A a 101 x41 字符串常量:”Abcd” ”A” ”123” “-12” 注意:程序中,常数由字面形式决定其类型;常数用多了影响程序通用性(尽量使用符号常量或变量)。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,2、符号常量符号名表示常数 (1)由 #define定义符号常量 #define PAI 3.14; /PAI宏名,习惯大写 float r,s; / r、s为变量,其值可变 s = PAI*r*r; /编译时PAI被替换为.14 PAI=33.33; X /禁止对符号常量赋值 (2)由const定义符号常量(c+中使用) const float PAI=3.1416;/PAI为符号常量 float r,s; s = PAI * r * r; / PAI值恒定不变 注意:符号常量习惯采用大写,使用好处是能做到“一改全改”。,二、变量,1、变量定义 语法: ; 例如:int m,t; /初值不确定 m=m+1; /用法不妥,m原值不确定 m=8;m=m+1; int n=12; /定义变量且初始化 t=m;m=n;n=t; / 交换m、n存储的值 m=n;n=m; / m、n的值能交换吗? 变量是存储数据的内存单元,在程序运行时刻其值可被改变。 变量定义是为其确定类型,在编译时刻为其分配内存单元。使用变量必须首先定义。 程序举例:输入两整数,交换后输出。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,2、变量命名规范 唯一命名,见名知义。变量唯一命名,符合“标识符”的定义,尽量见名知义; 标识符由字母、数字、下划线组成,并且只能由字母或下划线开头; 避免超长冲突。变量名不要超长(一般7-8个字符),否则会截断多余字符,引起同名冲突; 标识符中的字母大小写敏感。变量名中的字母大小写是敏感的(一般用小写); 避免使用保留字。变量名不要使用C语言的保留字(系统赋于特定含义的标识符,如if、for、while、do等)。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,2.3 运算符与表达式,表达式是由运算符和运算量组成的有意义的计算式子。例如:数学中 3.14 X R2 ( -b + ) 2 a2 b3 在程序中:如何写成表达式?,(a+b+c),main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,2.3.1 赋值运算,一、赋值表达式 语法: = 表达式的值赋给变量(存储到变量对应的存储单元中)。为赋值运算符,优先级最低。 int m,n; m=2; m=m+1; n=n+1; a=3.14 赋值表达式的值是3.14,a的值为3.14; a=b=c=5 自右向左结合, a、b、c的值都是5,整个赋值表达式的值是5; a=5+(c=6) 先求c=6,赋值表达式值为6,然后计算5+6,最后使a的值为11; if (a=8) t=a;先求赋值表达式的值为8,且a的值也为8;再判断80是否成立,如果成立t的值被赋于,否则t的值不变。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,二、(赋值)表达式语句 表达式后跟分号就构成为语句:;,r=12.3 ; s=3.14*r*r ; 赋值表达式语句,是语句单位 3.14*r*r; 合法的表达式语句,但无意义 sqrt(r); 函数表达式语句 a+b*c; 算术表达式语句,计算无意义 xa,2.3.2 算术运算,一、基本算术运算符 运算符: +、-、*、/、%(求余); 没有幂运算, xy由pow(x,y)函数计算; 优先级: *、/、%同级(高),+、-同级(低); 结合性:自左向右。 例如: float a,b;char c1=A,c2; a-b*c 等价于 a -(b * c) a-b+c 等价于 (a - b )+ c 1/3*(a+b+c) 结果为0 a%b 错;应为:(int)a%(int)b 8+3.5 结果为11.5,实型 c2=c1+4; c2的值是E,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,二、自反算术赋值运算符复合运算符 a+=b 等价于a=a+b c=b*=a+2 等价于b=b*(a+2),c=b x*=y+8 等价于x=x*(y+8) x%=3 等价于x=x%3 规则:任何基本算术运算符都可与赋值运算符复合成自反赋值运算符;如自反加赋值(+=)、自反减赋值(-=)、自反乘赋值(*=)、自反除赋值(/=)、自反模赋值(%=); 优先级: 与赋值运算符同级(最低); 结合性: 自右向左; 使用目的: 优化程序代码,提高执行效率。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,三、自加、自减运算符 例1:使i的值加1或减1的运算 +i;i+;-i;i-; 等价于i=i+1;i=i-1; 例2:自加(减)与引用的顺序 int i,j; i=3; j=+i*5; /先使i为4,后使j为20 i=3; j=i+*5; /先使j为15,后使i为4 i=3; i+; /仅使i为4,无先后问题 (1)结合方向:自右向左; (2)自加(减) 只适合整型变量,不能是表达式或常数。如5+;(x+y)+;都是错误的(char c=a;c+;行吗?); (3)前缀自加(减):先自加(减),后引用; 后缀自加(减):先引用,后自加(减)。,int a=2,b;b=+a+1; 先使a为3,后使b为4 int a=2,b;b=a-+1; 先使b为3,后使a为1 int a=2,b=2,c; c=a+b; 应理解成(a+)+b,结果:c为4,a为3,b不变;当出现难以区分的若干个+或-组成运算符时,语言规定,自左向右取尽可能多的符号组成运算符。 int a=2,b=2,c; c=a-b; 应理解成(a-)-b,结果:c为为0,a为1,b不变。实际运用时:尽量简单,使用括弧隔开,避免二义性。,举例:,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,四、正负号运算符 如:-a*b; 等价于:a = 0-a;a*b; 规则: 正负号运算符是单目运算符,优先级高于*、/。 结合方向是“自右向左”;,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,五、其它运算符,取地址运算符(,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,求字节数运算符 sizeof( ),short int m; m=sizeof(m); printf(“short m: %d bytesn”,sizeof(m); printf(“long: %d bytesn”,sizeof(long); printf(“int 88:%d bytesn”,sizeof(88); printf(“32769 :%d bytesn”,sizeof(32769);,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,表达式中的运算量可以是混合类型的,但系统在执行运算时仍要转换成类型相同的数据。 例如: char ch; int i, result; float f; double d; . result = ch / i + f * d ( f + i ) ; 结果类型? 类型转换规则: 自动转换 强制转换,2.3.3 不同类型混合运算,一、自动转换 自动转换发生时刻: 表达式运算时算术自动转换; 赋值运算时赋值自动转换; 函数引用时函数引用自动转换; 输出格式限制时输出自动转换?,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,1、算术自动转换 转换规则:“先必转”和“后提升”。 先必转: char、short必转为int; unsigned char、unsigned short必转为unsigned int; float 必转为double; 后提升:必转后剩下的int、unsigned int、long、unsigned long、 double五种类型,再根据运算符需要向高端类型提升。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,例如: char ch ; int i , result ; float f ; double d ; . result = ch / i + f * d ( f + i ) ;,后提升:i,先必转:ch、f,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,2、赋值时的自动转换 根据赋值对象的类型:可能提升,可能降格,也可能得到错误结果。例如: int m ; unsigned int n ; float a , b ; m = a/b ; /巧妙地实现取整运算 m += a + b ; /等价于:int(double)m +(double)a+(double)b m = -1 ; n = m ; /矛盾赋值, n的值为很大的整数(得到错误结果),main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,3、函数引用时的自动转换 实参与形参结合时隐式转换。 例如: int m=9 ; float x; x = sqrt( m ) ; 语法允许,参数结合时整型m自动转换为double型,最后x的值为整数3.0。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,4、输出时的自动转换? 格式转换符与输出数据类型相一致,否则得到错误结果(不提升,不降格)。 例如: printf( “%dn” , 3.14 ) ; /输出 31457 printf( “%un” , 3.14 ) ; /输出 34079 printf( “%fn” , 100 ) ; /运行时刻出错 printf( “%un” , -1 ) ; /输出 65535 经验:根据输入/输出数据的类型,严格选用相容的格式匹配符。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,自动转换注意事项: 负数转换为无符号数时,将丢失符号位功能,得到不正确的数据; 如:int m; unsigned int um; m=-2; um = m; /um为何值?小心! 降格转换时,数据的正确性受限于目标类型的有效范围限制。 如:int m; float x; x=3276789.0; m = x; /m为何值?小心!,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,二、强制转换 将变量从一种类型强制转换成另一种类型,满足表达式、函数或I/O的需要。 语法:(类型标识符) float a = 12.8 , b = 3.6 ; int m=1 ; printf( “%dn” , a%b ) ; /有错 printf( “%dn” , (int)a%(int)b) ; /正确 printf( “%fn” , m/3 ) ; /输出0.0 printf(“%fn”,m/3.0)或printf(“%fn”,float(m)/3); /输出0.333 注意事项: 各种类型标识符都可以用作强制类型转换符; 对变量作了强制类型转换后,其原来类型不变(一次有效)。,main( ) int a, b, sum; a=123; b=456; sum=a+b; printf(“%dn” , sum) ; ,Void main ( void ) int a, b, c; scanf( “%d%d”, ,BOOL运算包括关系、逻辑、条件运算,运算结果是逻辑值( 真/假,TRUE/FALSE,C中为 1 / 0 ) (1)关系运算符:、=、b;a=b;(b*b-4*a*c)d;a+b=c+d;a!=b 优先级:、=、=同级 = =、!=同级; 算术运算符 关系运算符 赋值运算符; 结合性:自左向右。,2.3.4 关系运算( P.56),(2) 关系表达式 用关系运算符连接算术表达式,叫关系表达式。关系表达式的值是逻辑值( C中用整数表示) : 成立取值(真),不成立取值(假)。 int a,b,c,d; a=1;b=5;c=a=b-4; /c的值为1 a=1;b=5;c=a=4-b; /c的值为0 a=1;b=5;c=0;d=ab=c; float x,y; if (x=y); /z=y不可靠 if (fabs(x-y)1e-3); /强力推荐,Void main ( void ) int a, b, c; scanf( “%d%d”, ,2.3.4 逻辑运算( P.56) &逻辑与,双目运算 (1)逻辑运算符 |逻辑或,双目运算 ! 逻辑非,单目运算 运算规则 &:两个运算量的值都为“真”时,结果才为“真”,否则为“假”。如:1&1,1&0,0&1,0&0 |:两个运算量的值都为“假”时,结果才为“假”,否则为“真”。如:1 | 1, 1 | 0, 0 | 1, 0 | 0 ! :运算量的值为“真”时,运算结果为“假”;运算量的值为“假”时,运算结果为“真”。 如: !1 , !0 例1:假定x=5,则: (x=0) & (x5) 表达式的值为0,Void main ( void ) int a, b, c; scanf( “%d%d”, ,优先级: !(非) &(与) |(或) !算术运算关系运算&|赋值运算 结合性:自左向右 真值表:,例如:int a=5,b=3,c=8,d=7; ab&cd 等价于(ab)&(cd) !b=c|dc&a+bc)&(a+b)b),(2)逻辑常量与逻辑变量,C语言没有提供逻辑型数据,关系表达式的值(真或假)分别用数值1和0表示。C+增加了逻辑型数据,逻辑型常量有false(假)和true(真)。 逻辑型变量要用类型标识符bool来定义,它的值只能是true和false之一。如: bool found,flag=false; /定义逻辑变量found和flag found=true; /true赋给逻辑变量found 编译处理时,false处理为0,true处理为1。因此,逻辑型数据可以与数值型数据进行算术运算。 一个非零整数赋给逻辑型变量,则按“真”处理。如: flag=123; /赋值后flag的值为true coutflag; /输出为数值1。,Void main ( void ) int a, b, c; scanf( “%d%d”, ,(3)逻辑表达式 用逻辑运算符连接起来的式子叫逻辑表达式。 逻辑运算结果为True/False,C中为1/0;即C用整数表示逻辑值:为假,1为真,非0也为真。,!的值为;!1&1 值为0,当a=3、b=5时: a&b的值为;!a&b的值为0;!a&!b的值为0 a|b的值为1;!a|b的值为1;!a|!b的值为,a,a|b|c为例:只有a为真时,就不判别b、c;若a假、 B真,就不判别c;例如:x=z=-1;y=1;+x|y+|+z;,Void main ( void ) int a, b, c; scanf( “%d%d”, ,Year是闰年必满足其一:能被整除、但不能被整除;能被整除、又能被整除; 描述数学关系:axb 表示图形阴影(红色)部分的逻辑表达式:,x-2&x-2&y1,(year%4=0&year%100!=0)|(year%4=0&year%400=0),a=x=b 语法正确,语义错!,x=a&x=b 很好的描述,注意区别:abc 与 ab&bc,或 year%4=0&(year%100!=0|year%400=0),阅读下列程序例: 0, 0 1, 0 0,1 1,0 Void main(void) char c=k ; int i=1 , j=2 , k=3; float x=3e+5 , y=0.85; printf(“%d,%dn“, !x|!y , !x ); printf(“%d,%dn“ , x|i ,2.3.4 条件运算 语法: ? : 运算功能: 先求表达式1的值v1;如果v1为真, 则求表达式2的值v2,整个表达式的值为v2 ;如果v1为假,则求表达式3的值v3,整个表达式的值为v3 。 ?运算符是三目运算符,具有if-then-else功能例如: 选择a、b中较大的数: 选择a、b、c中较大数:,m=ab?a:b ;,m= (max=ab?a:b) c?max:c;,2.4 标准输入/输出函数p.57,1、printf()函数头文件为:stdio.h printf (, ); 表达式表:输出对象,逗号间隔的表达式; 格式字符串:由原样输出的字符、“%格式字符” 、 “转义字符” 等组成;,例如:int m=22; float a=22.2,b=33.3; printf(“%d,%f,%fn“,m,a,b); printf(“a=%dtb=%ftc=%fn“,m,a,b);,说明 格式字符要用小写 格式字符与输出项个数应相同,按先后顺序一一对应,格式控制符表,Void main ( void ) int a, b, c; scanf( “%d%d”, ,2、scanf()函数头文件为:stdio.h scanf(, ); Void main(void) int m; float a,b; printf(“Please input m a b :“) ; scanf(“%d%f%f“, ,Void main ( void ) int a, b, c; scanf( “%d%d”, ,格式转换与输入输出流缓冲区概念 Void main(void) int m; float a,b; scanf(“%d%f%f“, ,22 22.2 33.3,m=22 a=22.2 b=33.3,22,22.2,33.3,m=22,a=22.2,b=33.3,22 22.2 33.3,Void main ( void ) int a, b, c; scanf( “%d%d”, ,2.5 字符输入输出函数p.55 1、字符输入/输出函数 getch ()、getche() 头文件为:conio.h getchar()、putchar(c) 头文件为:stdio.h 例如: #include “stdio.h” #include “conio.h” void main(void) char c ; c=getch(); /读一字符送c,不需回车,不回显 putchar(c); /输出该字符 c=getche(); /读一字符送c,不需回车,回显 putchar(c); c=getchar(); /读字符直到回车,回显 putchar(c); /显示输入的第一个字 getch(); /读到的是前一个回车字符 ,void main(void) char c; c=getchar( ); if (cA ,2、字符串输入/输出函数 gets(s): char s10; gets(s); 读入字符串直到回车结束,存入s(字符数组名或字符串指针),但回车符不属于这个字符串。 puts(s):输出字符串并换行,功能等价于 printf(“%sn”, s),其中s为字符数组名或字符串指针);,void main(void) char c; c=getchar( ); if (cA ,举例: #include void main( void ) char s20, f20 ; printf(“Whats your name?n“) ; gets(s) ; /等待输入字符串直到回车结束 puts(s); /将输入的字符串输出 puts(“How old are you?“) ; gets( f ) ; puts( f ) ; strcpy(s,“Turbo C“) ; /字符串数组赋值 puts(s) ; puts(f); ,void main(void) char c; c=getchar( ); if (cA ,void main(void) char c; c=getchar( ); if (cA ,注意事项: gets(str)作用与scanf(“%s”, str)类似,但不完全相同(其中:str20)。 scanf(“%s”, str)输入时,遇到空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理。 gets(str) 函数将接收输入的整个字符串直到回车为止。,2.6 流输入输出p.50 C和C+本身都没有为输入和输出提供专门的语句,而是在编译系统提供的I/O库中定义的。 C+的I/O采用“流”(stream)的方式,cin、cout和流运算符是定义在C+的输入输出流库中,使用它们时必须使用预处理命令:#include 。流进行输入输出的过程示意图:,Void main( void ) int a,b,sum; cinab; sum=a+b; cout“a+b=“sumendl; ,一个cout语句可以分写成若干行。 如: cout“This is a simple C+ program.”endl; 可以写成 cout“This is ” /注意行末尾无分号 “a C+” “ program.” endl; /语句最后有分号 也可写成多个cout语句,即 coutThis is ; /语句末尾有分号 cout a C+ ; cout program.; coutendl; 以上3种情况的输出均为This is a simple C+ program.,Void main( void ) int a,b,sum; cinab; sum=a+b; cout“a+b=“sumendl; ,在用cout输出时,系统会自动判别输出数据的类型,按相应的类型输出。如: int a=4; float b= 345.789; char c=a; coutatbtcendl; 输出结果: 4 345.789 a,Void main( void ) int a,b,sum; cinab; sum=a+b; cout“a+b=“sumendl; ,一个cin语句可以分写成若干行。 如 cinabcd; 可以写成: cina /注意行末尾无分号 b c d; 也可以写成: cina; cinb; cinc; cind; 以上4种情况都可以从键盘输入: 1 2 3 4 也可以分多行输入数据:1 2 3 4 ,Void main( void ) int a,b,sum; cinab; sum=a+b; cout“a+b=“sumendl; ,cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有: char c1,c2; int a; float b; cinc1c2ab; 如果输入 1234 56.78,Void main( void ) int a,b,sum; cinab; sum=a+b; cout“a+b=“sumendl; ,流中使用控制符*p.50,一般使用cout和cin时的默认格式。有特殊要求时,使用控制符(表3.1) ,控制输出数据宽度、精度对齐等

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论