《【教学课件】第二章C程序设计的初步认识.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第二章C程序设计的初步认识.ppt(46页珍藏版)》请在三一办公上搜索。
1、第二章 C程序设计的初步认识,数据类型常量与变量整型、实型、字符型不同类型数据间的转换运算符和表达式,2.1 数据类型,2.2 常量与变量常量和符号常量常量:在程序运行过程中,其值不能改变的量 如;12,0,-3,4.6,-1.23,a,c符号常量:用一个标识符代表一个常量例2.1 符号常量的使用#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(“total=%d”,total);,运行结果:total=300,符号常量的好处含义清楚 如 PRICE 代表价格能做到一改全改 如#define PRICE 35 程
2、序中所有以PRICE代表的价格自动改为35,变量在程序运行过程中,其值可以改变的量变量有一个名字变量在内存中占一定的存储单元,标识符定义:用来标识变量、常量、函数等的有效字符序列组成:只能由字母、数字、下划线组成,且第一个字符必须是字母或下划线大小写敏感命名原则:见名知意变量名尽量用小写,符号常量用大写长度尽量不要超过8个字符尽量不使用下划线开头不能用关键字作标识符避免使用容易认错的字符,例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$123,3days,#33,ch
3、ar,$123,ab,变量的使用应“先定义,后使用”未被事先定义的不作为变量名 例:如果在定义部分写了 int student;而在执行语句中错写成stadent.如:stadent=30;则输出错误“变量stadent未定义”编译时根据变量的类型为其分配相应的存储单元 如 int为两个字节 float为四个字节编译时根据变量的类型检查运算是否合法 如%运算只能在整型数据之间进行 如果a,b为两个实型变量,则a%b是错误的,2.3 整型数据整型常量的表示方法十进制整数 如;123,-456,0八进制整数 以0开头的数 如:0123即(123)8 其值为1*82+2*81+3*80=83十六进制
4、整数 以0 x开头的数 如:0 x123即(123)16 其值为1*162+2*161+3*160=291,要注意各种进制数字的组成,各种进制之间的转换二进制、八进制、十六进制转换成十进制方法:按权相加,各种进制之间的转换(整数)二进制、八进制、十六进制转换成十进制方法:按权相加,十进制转换成二进制、八进制、十六进制,方法:连续除以基,从低到高记录余数,直至商为0,二进制与八进制之间的转换二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制八进制转换成二进制:用3位二进制数代替每一位八进制数,例(1101001)2=(001,101,001)2=(151)8,例(246)8
5、=(010,100,110)2=(10100110)2,000 0001 1010 2011 3100 4101 5110 6111 7,二进制与十六进制之间的转换二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制十六进制转换成二进制:用4位二进制数代替每一位十六进制数,例 2=(0011,0101,0111,1101)2=(357D)16,例(4B9E)16=(0100,1011,1001,1110)22,0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C110
6、1 D1110 E1111 F,字节和位内存以字节为单元组成每个字节有一个地址一个字节一般由8个二进制位组成每个二进位的值是0或1,整型变量整型数据在内存中的存放在内存中以二进制形式存放一个整型变量在内存中占两个字节 如:int i;i=10;数据在内存中的实际存放情况补码正数的补码和其原码形式相同负数的补码取-10的绝对值按位取反加1,整型变量的分类有符号基本整型 signed int无符号基本整型 unsigned int有符号短整型 signed short int 无符号短整型 unsigned short int 有符号长整型 signed long int无符号长整型 unsign
7、ed long int,有符号整型变量,无符号整型变量,ANSI标准定义的整数类型,整型变量的定义int a,b;unsigned short c,d;long e,f,例2.2 整型变量的定义与使用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);,运行结果:a+u=22,b+u=-14,整型数据的溢出,例2.3 整型数据的溢出main()int a,b;a=32767;b=a+1;printf(“%d,%dn”,a,b);,运行结果:32767,-32768,整型常量的
8、类型其值在-32768+32767范围内的整数认为它是int 型其值超出上述范围,在-2147483648+2147483647范 围内,则认为是长整型一个整型常量后加一个字母u,认为是unsigned int 型 如12345u。如果是-12345u,则先将-12345转换成补码 53191,然后按无符号数存储。一个整型常量后面加一个字母l或L,认为是long int 型,思考题 请写出下列程序的运行结果,main()long int a;a=32767+1;printf(“a=%ldn”,a);main()long int a;a=32768;printf(“a=%ldn”,a);,2.4
9、 实型数据实型常量的表示方法十进制小数形式 由数字和小数点组成(必须有小数点)如;.123、123.、123.0、0.0指数形式 如:123e3或123E3 都代表123*103 字母e之前必须有数字,e后面的指数必须为整数规范化的指数表示形式 一个实数可以有多种指数表示形式 如123.456可表示为123.456e0、12.3456e1、1.23456e2、0.123456e3等 字母e之前的小数部分中,小数点左边有且只能有一位 非零的数字,实型变量实型数据在内存中的存放 实型变量的分类,实型数据的舍入误差 例2.4 实型数据的舍入误差main()float a,b;a=123456.789
10、e5;b=a+20;printf(“%fn”,b);,运行结果:,实型常量的类型 系统将实型常量作为双精度来处理 可在数的后面加字母f或F,按单精度处理,2.5 字符常量定义:用单引号括起来的单个普通字符或转义字符.,如 101-A 012-n 376-x61-a 60-0 483-(),例:A-101-x41-65,如 a A?n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,例 转义字符举例main()printf(101 x42 Cn);printf(I say:How are you?n);printf(C Programn);printf(Turbo C);,运行结果:(屏
11、幕显示)A B CIsay:”How are you?”C ProgramTurbo C,例 main()printf(“Yb=n”);,运行结果:屏幕显示:=打印机输出:,例2.5 转义字符的使用main()printf(“ab ct derftgn);printf(“htibbj kn);,运行结果:屏幕显示:f gde h j k打印机输出:fab c gde h jik,字符变量定义形式 char c1,c2;赋值 c1=a;c2=b;,字符数据在内存中的存储一个字符在内存中占一个字节字符数据在内存中以ASCII码存储,例2.6 向字符变量赋以整数main()char c1,c2;c1
12、=97;c2=98;printf(”%c%cn”,c1,c2);printf(”%d%dn”,c1,c2);,字符数据和整型数据存储形式相似,可以互相转换,一个字符型数据既可以以字符形式输出,也可以以整数形式输出,运行结果:a b97 98,例2.7 大小写字母的转换main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(%c%cn,c1,c2);,运行结果:A B,字符数据与整型数据可以互相赋值 int i;char c;i=a;c=97;,字符变量中的最高位为符号位,字符常量与字符串常量不同,字符串常量定义:用双引号(“”)括起来的字符序列存
13、储:每个字符串尾自动加一个 0 作为字符串结束标志,例:char ch;ch=“A”;,如“how do you do”,“china”,”a”,ANSI标准定义的数据类型,整型,字符型,实型,有,无,2.6 变量赋初值定义变量的同时使变量初始化 如:int a=3;float f=3.56;char c=a;也可部分赋初值 如:int a,b,c=3;对几个变量赋初值,可写成 int a=3,b=3,c=3;不能写成 int a=b=c=3;,2.7各类数值型数据间的混合运算,2.8 算术运算符和算术表达式,算术运算符和表达式基本算术运算符:+-*/%说明:两整数相除,结果为整数 采取“向零
14、取整”的方法%要求两侧均为整型数据,例 5/2=5/2.0=,例 5%2=-5%2=1%10=5%1=5.5%2,例 5/2=2 5/2.0=2.5,例 5%2=1-5%2=-1 1%10=1 5%1=0 5.5%2(),算术表达式和运算符的优先级与结合性C算术表达式:用算术运算符和括号将运算对象连接起来的、符合C语法规则的式子结合方向为“自左至右”,例 a*b/c-1.5+a ab*c/1.5-a+,强制类型转换运算符可以将一个表达式转换成所需类型形式(类型名)(表达式)类型名与表达式都应用括号括起来,例(double)a(int)(x+y),说明:强制类型转换时,得到一个所需类型 的中间变
15、量,原变量的类型未发生变化,例2.8 强制类型转换main()float x;int I;x=3.6;i=(int)x;printf(”x=%f,i=%dn”,x,i);,运行结果:x=3.600000,i=3,自增、自减运算符+-作用:使变量值加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,/
16、3,/c=20,a=4,/c=15,a=4,自增、自减运算符+-作用:使变量值加1或减1种类:前置+i,-i(先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1),说明:+-不能用于常量和表达式,如5+,(a+b)+-结合方向:自右向左优先级:-+-*/%-+-,例-i+-(i+)i=3;printf(“%d”,-i+);/-3,例-i+i=3;printf(“%d”,-i+);,表达式使用中的问题说明注意编译系统的调用顺序例设i=3;求(i+)+(i+)+(i+)有的系统值为9,有的为12turboc系统中得到9(+i)+(+i)+(+i),运算符的组成 自
17、左至右尽可能多的将若干个字符组成一个运算符实参的求值顺序 printf(“%d,%d”,i,i+);(i的值为3)有的系统值为3,3有的为4,3 turboc系统中得到4,3,赋值运算符和表达式赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量,类型转换实型数据赋给整型变量时,舍弃实数的小数部分 int i;i=3.56;i的值为3,以整数形式存储将整型数据赋给单、双精度变量时,数值不变,补足有效数字,以浮点数形式存储到变量中。float f;f=23;转换成23.00000存储 double f;f=23;转换成23.00000000000000存储注意:
18、单、双精度变量的有效数字的位数,类型转换将一个double数据赋给float变量时,截取其前面7位有效数字,存放到存储单元中。注意:数值范围不能溢出将一个float数据赋给double变量时,数值不变,有效位数扩展到16位,以64位存储。字符型数据赋给整型变量字符为无符号量时,将字符的8位放到整型变量的低8位,高8位补零。若为有符号字符,最高位为零,则整型变量的高8位补零,c=376,类型转换若字符最高位为1,则高八位全部补1。注意:目的是使数值保持不变将一个int、short、long数据赋给char变量时,只将其低8位原封不动送到char型变量。,i=289,c=376,类型转换将int型
19、数据赋给long变量时,进行符号扩展,将整型数的16位送到long型低16位中,如果int为正值,则long高16位补零,如果int为负值,则高16位补1。将一个long数据赋给int变量时,将其低16位原封不动送到整型变量。将unsigned int型数据赋给long型变量时,高位补零将一个unsigned类型数据赋给一个占字节数相同的整型变量,将unsigned型变量的内容原样送到非unsigned变量中。若为有符号字符,最高位为零,则整型变量的高8位补零。注意:有可能出现数据错误,类型转换unsigned int a=65535;int b;b=a;注意:根据补码知识,b的值为-1。将非
20、unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋。,例2.9 有符号数据传送给无符号变量 main()unsigned a;int b=-1;a=b;printf(“%u”,a);,运行结果:65535,不同类型的整型数据间的赋值:按存储单元中的存储形式直接传送,复合的赋值运算符在“=”前加上其他运算符,可构成复合的运算符 a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8)x%=3 等价于 x=x%3 为便于记忆,可以这样理解 a+=b(a为变量,b为表达式)a+=b(将有下划线的移到“=”右侧)a=a+b(在“=”左侧补上变量名a)10种复合赋值运
21、算符+=,-=,*=,/=,%=,=,&=,=,|=,赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子形式 变量赋值运算符表达式 求解过程 将赋值符右侧的表达式的值赋给左侧的变量,说明:结合方向:自右向左左侧必须是变量,不能是常量或表达式,例 3=x-2*y;a+b=3;,赋值表达式的值与变量值相等,且可嵌套,例:a=b=c=5 a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),赋值表达式也可以包含复合的赋值运算符,例:a=12;a+=a-=a*a,例:int a=2;a%=4-1;a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a
22、=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),逗号运算符和表达式形式:表达式1,表达式2,表达式n结合性:从左向右求值顺序:表达式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,
23、x=3,/1,2,3,/3,2,3,逗号运算符和表达式形式:表达式1,表达式2,表达式n结合性:从左向右求值顺序:表达式1,表达式2,表达式n逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例:main()int x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%dn,x);,运行结果:x=3,main()char a=176,b=219;printf(%c%c%c%c%cn,b,a,a,a,b);printf(%c%c%c%c%cn,a,b,a,b,a);printf(%c%c%c%c%cn,a,a,b,a,a);printf(%c%c%c%c%cn,a,b,a,b,a);printf(%c%c%c%c%cn,b,a,a,a,b);,