第2章C语言数据类型与基本操作.ppt
1,常量和变量标识符与关键字整型数在计算机中的存储方式有符号的数据类型和无符号的数据类型运算符及表达式不同类型数据间的转换,第二章 C语言数据类型与基本操作,2,数据类型,数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作,3,基本类型,类型,关键字,取值范围,位数,说明:数据类型所占位数随机器硬件不同而不同,上表以微机为例:,long double 80 1e-49311e4932,字符型,浮点型,整 型,4,整型常量 十进制:例 15,19,123,-345,0 八进制:以 0(零)开头的整数,例 0123,011 十六进制:以 0 x 或 0X 开头的整数,例 0 x123,0Xff,注:用 l或 L表示一个数是长整型,例 123L;无符号数用 u 或 U表示,无符号长整型用 ul 或 UL 表示,例:123u,0 xful,问题:0123=()100 x123=()100Xff=()10,例 12 与 12L,例 30000 为int型 65536 为long int 型,2.1 常量与变量,5,实型常量 格式:(必须有小数点)例 0.123,.123,123.0,0.0,123.指数格式:(必须有 数字 在 e 或 E的前面;指数 必须是 整型)例:12.3e3,123E2,1.23e4,e-5,1.2E-3.5,注:用 f 或 F 注明是单精度,用l 或 L 注明是长双精度,没有注明则是 双精度.,6,字符常量和转义字符用单撇号括起来的一个字符;,一个字符的值可用ASC数值表示;,如 101-A 012-n 376-x61-a 60-0 483-(),例:A-101-x41-65,如 A65,a97,048,n10,如 a A?n 101,特殊形式的字符常量就是以一个“”开头的字符序列,称为转转义字符。例:n(换行);,例 转义字符举例(ch2_001.c,ch2_004.c)main()printf(101 x42 Cn);printf(I say:How are you?n);printf(C Programn);printf(Turbo C);,运行结果:(屏幕显示)A B CI say:”How are you?”C ProgramTurbo C,例 main()printf(Yb=n);,运行结果:屏幕显示:¥,7,注:字符与字符串的区别.,字符串常量用 双撇号 括起来的0个或多个字符序列;在内存中用0 作结束标记,它是一个空操作.,8,常用大写字母,与变量名区分开来。不是一个变量,是一个常量。符号常量可以是:整型常量 实型常量 字符常量 字符串常量,如#define PRICE 30,符号常量 定义:用一个标识符代表一个常量#define 标识符 代表的常量,例 符号常量举例(ch2_1.c)#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);,运行结果:total=300,9,变量 变量 及 赋值 定义变量:数据类型 var1,var2,var n;,一个变量可以边定义边赋值;,例:int a,b,c;float data;,变量类型决定变量所占存储空间大小,变量名,例: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;,所有变量必须先定义后使用。.,例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,一般在函数开始部分定义.,10,整型变量占 2 字节bytes;shortintlongsizeof(type)求字节数,实型变量单精度:占 4 bytes,7 位有效数值双精度:占 8 bytes,1516位有效数值,字符变量 以 ASC 字符集中的数值保存在内存中;字符可以当作一般整型数来处理.,例 float a;a=111111.111;/*a=111111.1*/double b;b=111111.111;/*b=111111.111*/,例 a=D;/*a=68;*/x=A+5;/*x=65+5;*/s=!+G/*s=33+71;*/,C程序 中没有 字符串变量,11,例#define PRICE 12.5 main()int num=3;float total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(total=%f,ch1=%cn,total,ch1);,运行结果:total=37.500000,ch1=d,12,2.2 标识符和关键字,-标识符一个标识符可由字母、数字和下划线组成;必须用字母或下划线开头;大小写要区分;不能用保留关键字作变量名;避免混淆的字母;例如:l 与 I,o 与 0.,例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$123,13,32 个关键字:(由系统定义,不能重作其它定义)auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort signed sizeof static structswitch typedef unsigned union voidvolatile while,-关键字,14,2.3 整型数在计算机中的存储方式,1.二进制位与字节 计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位(bit)构成,每位的取值为0/1。最右端的那1位称为“最低位”,编号为0;最左端的那1位称为“最高位”,而且从最低位到最高位顺序,依次编号。图11-1是1个字节各二进制位的编号。图11-1 1个字节各二进制位的编号2.数值的原码表示数值的原码表示是指,将最高位用作符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值(以二进制形式表示)的表示形式。为简化描述起见,本节约定用1个字节表示1个整数。,15,2.3 整型数在计算机中的存储方式,例如,+9的原码是00001001 符号位上的0表示正数-9的原码是10001001。符号位上的1表示负数 3.数值的反码表示数值的反码表示分两种情况:(1)正数的反码:与原码相同。例如,+9的反码是00001001。(2)负数的反码:符号位为1,其余各位为该数绝对值的原码按位取反(1变0、0变1)。例如,-9的反码:因为是负数,则符号位为“1”;其余7位为-9的绝对值+9的原码0001001按位取反为1110110,所以-9的反码是11110110。,16,2.3 整型数在计算机中的存储方式,4.数值的补码表示数值的补码表示也分两种情况:(1)正数的补码:与原码相同。例如,+9的补码是00001001。(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。例如,-9的补码:因为是负数,则符号位为“1”;其余7位为-9的绝对值+9的原码0001001按位取反为1110110;再加1,所以-9的补码是11110111。已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位不变,其余各位取反,然后再整个数加1。,17,2.3 整型数在计算机中的存储方式,例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。5.数值在计算机中的表示补码在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。,18,2.4 有符号的数据类型和无符号的数据类型,表2.3基本数据归纳,19,2.5 运算符及表达式,算术运算符:+-*/%+-关系运算符:=!=逻辑运算符:!&|位运算符:|&赋值运算符:=+=-=条件运算符:?:逗号运算符:,地址运算符:*&求字节数运算符:sizeof强制类型转换:(type-name)分量运算符:.-下标运算符:其他:()-,20,赋值运算符和复合赋值运算符及表达式简单的赋值运算=变量=表达式,复合的赋值运算符+=-=*=/=%=&=|=变量1 操作符=表达式2 变量1=变量1 操作符 表达式2,例 a=3;d=func();c=d+2;,21,算术运算符及表达式运算符:+-*/%(取余)+(自增)-(自减)运算规律:从左至右优先级:%-*/-+-(1)(2)(3)注:两个整数/是 整型;两个整数%是 整型.,例 5/2=-5/2=,例 5%2=-5%2=1%10=5%1=5.5%2,例 5/2=2-5/2=-2(向零取整),例 5%2=1-5%2=-1 1%10=1 5%1=0 5.5%2(),22,自增、自减运算符+-自增、自减在变量前面:+i,-i(在表达式中,先自加(自减)后用其值)在变量后面:i+,i-(在表达式中,先用其值再自加(自减)),例 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,23,注意:只针对变量,而不针对常量和表达式;不要产生二义性;运算规律是自右至左。如 8+(x*y)+,j=-(+k);k=4 j=-4,j=-(k+);k=4 j=-3,例 k=3;j=-+k;j=-k+;,解决办法避免在同一表达式中的同一变量的自加自减.,例:i=3;y=(i+)+(i+),y=6 i=5 y=3+3;i+;i+;y=7 i=5 y=3+4;i+;,24,2.不使用连续运算符,用括弧分隔。,例1:i=3;j=1;x=i+j;,例3:i=3;printf(%d,%d,i,i+);,x=i+(+j);x=5 i=3 j=2 x=(i+)+j;x=4 i=4 j=1,例2:i=3;j=1;x=i-+j;,等价于 x=i-(+j);x=1 i=3 j=2,可能输出:3,3 4,3,3.在函数调用时,实参的求值顺序C无统一规定.,25,注:运算顺序:右-to-左操作符左边只能是 变量,不能是常量和 表达式,高到低转换数据有可能丢失,例 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,例:int a=2;a%=4-1;a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),26,长度测试运算符sizeof,长度测试运算符sizeof可用来测试某个类型的变量所占用计算机内存空间的字节长度。格式为:sizeof(类型名),例:main()printf(char:%d bytesn,sizeof(char);printf(short:%d bytesn,sizeof(short);printf(int:%d bytesn,sizeof(int);printf(long:%d bytesn,sizeof(long);printf(float:%d bytesn,sizeof(float);printf(double:%d bytesn,sizeof(double);,27,关系运算及关系表达式=!=运算顺序:左-to-右 优先级:,例 ca+b/c(a+b)ab!=c/(ab)!=c a=bc/a=(bc),关系表达式的值为一个逻辑值,用 1 代表“真”,用 0 代表“假”。非零数也表示“真”。,例 int a=3,b=2,c=1,d,f;ab(ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,28,注意:,例 若 a=0;b=0.5;x=0.3;则 a=x=b的值为,0,例 5278在C中是允许的,值为,0,例 int i=1,j=7,a;a=i+(j%4!=0);则a=,2,例 a0 结果为 A100 结果为,1,0,29,注意:,例 注意区分“=”与“=”int a=0,b=1;if(a=b)printf(a equal to b);else printf(a not equal to b);,例 应避免对实数作相等或不等的判断如 1.0/3.0*3.0=1.0 结果为可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,30,逻辑运算符和逻辑表达式!&|,运用逻辑值:0 表示“假”非0 表示“真”求逻辑值时:“假”则为0“真”则为1,31,例 ab&xy a=b|x=y!a|ab,优先级别:,运算顺序:,/(a=x)&(x=b),/(ab)&(xy),/(a=b)|(x=y),/(!a)|(ab),例 a=4;b=5;!a a&b a|b!a|b 4&0|2 53&2|84-!0 c&d,/值为1,/值为0,/值为1,/值为1,/值为1,/值为1,/(53)&2|(8(4-(!0)值为1,例:已知year 为整型变量,不能使表达式(year%4=0&year%100!=0)|(year%400=0)的值为“真”的数据是()(A)1990(B)1992(C)1996(D)2000,32,优先级别:,运算顺序:,短路特性:结果能确定后,后面的就不再运算。,例 a(m=ab)&(n=cd),/结果m=0,n=1,33,例 求 a+|b|printf(a+|b|=%dn,b0?a+b:a-b);,例(a=b)?Y:N(x%2=1)?1:0(x=0)?x:-x(c=a&c=z)?c-a+A:c,先求表达式1,根据其值再求表达式2或表达式3;如 x0?1:(x0?-1:0),运算顺序:right-to-left 如 ab?a:cd?c:d ab?a:(cd?c:d)expr1、expr2、expr3 值的类型如果不一样,则值转换成较高的类型.,例 x?a:b/x=0,表达式值为b;x0,表达式值为a xy?1:1.5/xy,值为1.0;xy,值为1.5,条件运算符及条件表达式 表达式1?表达式2:表达式3 像 if 语句的简化,34,条件运算符及条件表达式,例:从键盘读入一个整数赋给x,如果x大于等于0,把x的平方赋给y,否 则把x的2倍赋给y。#include stdio.h void main()int x,y;scanf(%d,分析下列程序的输出结果。#include stdio.hvoid main()int i,j,k,a=3,b=2;i=(-a=b+)?-a:+b;j=a+;k=+b;printf(i=%d,j=%d,k=%dn,i,j,k);,请编制程序,任意输入两个整数,输出其中较小者。main()int n1,n2,main;clrscr();printf(input two number(n1,n2):);scanf(%d,%d,编制程序,输入大写字母,则输出小写字母;输入小写字母,则输出大写字母。main()char ch;printf(input any letter:);scanf(%c,35,逗号运算符和逗号表达式表达式1,表达式2,表达式n运算顺序:左-to-右逗号表达式的值是 表达式 n 的值不是所有的逗号都是逗号表达式,例 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,例:/*ch2_6.c*/#include main()int x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%dn,x);,运行结果:x=3,36,位运算,位运算符,1按位与&,(1)格式:x&y,(2)规则:对应位均为1时才为1,否则为0:3&9=1。,(3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。,例如,3&9=1:0011&1001 0001=1,2按位或|,(1)格式:x|y,(2)规则:对应位均为0时才为0,否则为1:3|9=11。,例如,3|9=11:0011|1001 1011=11,(3)主要用途:将1个数的某(些)位置1,其余各位不变。,37,位运算,3按位异或(1)格式:xy(2)规则:对应位相同时为0,不同时为1:39=10。(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。4按位取反(1)格式:x(2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:在IBM-PC机中,00 xffff,9=0 xfff6。(3)主要用途:间接地构造一个数,以增强程序的可移植性。5按位左移(1)格式:x 位数(2)规则:使操作数的各位左移,低位补0,高位溢出:52=20。,38,位运算,6按位右移(1)格式:x位数(2)规则:使操作数的各位右移,移出的低位舍弃;高位:1)对无符号数和有符号中的正数,补0;2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20 2=5。说明:(1)x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。(2)参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。例如,5 2=5:10100 00101。,39,位运算,(3)实现&、|、运算主要用途的方法 1)构造1个整数:该数在要取(或保留)的位、或要置1的位、或要翻转的位上为1,其余均为0。2)进行按位与、或按位或、或按位异或操作。(4)实现按位取反主要用途的方法 1)求0,间接地构造一个全1的数;2)按需要进行左移或右移操作,构造出所需要的数。例如,直接构造一个全1的数,在IBM-PC机中为0 xffff(2字节),而在VAX-11/780上,却是0 xffffffff(4字节)。如果用0来构造,系统可以自动适应。,40,2.6 不同类型数据间转换 自动转换(automatic)转换规律如下图,41,42,强制转换(类型)(表达式)例(int)(x+y)(int)x+y(double)(3/2)(int)3.6 注意 值的类型转换了,但变量的类型没变.,例 main()float x;int i;x=3.6;i=(int)x;printf(x=%f,i=%d,x,i);结果:x=3.600000,i=3,思考,43,本章小结1、基本数据类型的种类、取值范围、在内存中占用字节数;2、常量的表示方法;3、标示符的命名规则,变量的赋值、存放数据的实质;4、数据类型的转换规律;5、字符与字符串的区别;6、运算符及表达式:符号、结合规律、优先级、取值;7、逻辑运算符及逻辑值的表示;8、逗号表达式及取值。,44,练习题1、设int x=1,y=1;表达式(!x|y-)的值是()A.0 B.1 C.2 D.-12、以下选项中合法的用户标识符是()A.long B._2test C.3dmax D.a.dat3、若x=3.5,y=2.5,a=2,b=3,则(float)(a+b)/2+(int)x%(int)y=()A.3.5 B.2.6 C.3 D.2.14、假设x和y为double型,则表达式x=2,y=x+3/2的值是()A.3.500000 B.3 C.2.000000 D.3.0000005、已知a大于b及a小于等于c,则可以表示为()A.b=a6、c语言中合法的常量为()A.e-3 B.1.2e+02 C.039 D.xab7、int I=0;执行语句while(I+5);后,I的值是()A.5 B.6 C.7 D.48、表达式:10!9的值是()A.true B.0 C.1 D.非零值9、判断题:a和“a”在内存中所占字节相同。()c语言没有逻辑值。(),45,练习题参考答案1、设int x=1,y=1;表达式(!x|y-)的值是(B)A.0 B.1 C.2 D.-12、以下选项中合法的用户标识符是(B)A.long B._2test C.3dmax D.a.dat3、若x=3.5,y=2.5,a=2,b=3,则(float)(a+b)/2+(int)x%(int)y=(a)A.3.5 B.2.6 C.3 D.2.14、假设x和y为double型,则表达式x=2,y=x+3/2的值是(D)A.3.500000 B.3 C.2.000000 D.3.0000005、已知大于b及a小于等于c,则可以表示为(D)A.b=a6、c语言中合法的常量为(b)A.e-3 B.1.2e+02 C.039 D.xab7、int I=0;执行语句while(I+5);后,I的值是(B)A.5 B.6 C.7 D.48、表达式:10!9的值是(C)A.true B.0 C.1 D.非零值9、判断题:a和“a”在内存中所占字节相同。()c语言没有逻辑值。(),