第02章数据类型、运算符与表达式_第1页
第02章数据类型、运算符与表达式_第2页
第02章数据类型、运算符与表达式_第3页
第02章数据类型、运算符与表达式_第4页
第02章数据类型、运算符与表达式_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章 数据类型、运算符与表达式 本章教学目的: 熟练掌握C程序中经常用到的常量、变量、基本数据类型、运算符、表达式等的用法 。本章教学重点: 常量和变量、整型、实型、字符型、算术运算符和算术表达式、赋值运算符和赋值表达式。本章教学难点: 变量、数据类型、数据的输入输出、不同数据类型间的混合运算、自增自减运算符。本章作业: 教材第18页 2.1的1、2、3题、2.2的1、2、3题。 C语言的数据类型语言的数据类型 常量和变量常量和变量 整形、实型和字符型数据整形、实型和字符型数据 算术运算符和算术表达式算术运算符和算术表达式 赋值运算符和赋值表达式赋值运算符和赋值表达式 其他运算符和表达式其他

2、运算符和表达式 数据类型空类型指针类型基本类型整型字符型枚举类型有符号整型无符号整型实型单精度实型双精度实型构造类型数组类型结构体类型共用体类型 常量:程序运行过程中,其值不能被改变的量称为常量。 常量的分类: 整型常量:12,0,-3 实型常量:4.6, -5.89 字符常量: a,A,#,3 符号常量:用一个标识符代表一个 常量。例如若在程序开始有这样的预处理命令:#define N 10,那么C预处理程序会将程序中所有的N用10代替。在程序运行过程中,其值可以被改变的量称为变量变量。在使用一个变量前,必须先定义该变量,就是为该变量起个名字,并声明它的数据类型。用来标识变量名(或符号常量名

3、、函数名、数组名、类型名、文件名)的有效字符序列称为标识符标识符。标识符只能由英文字母、数字、下划线三种字符组成,并且第一个字符必须是字母或下划线。 注意注意,大写英文字母和小写英文字母是不同的字符,例如aver和Aver是两个不同的变量名。变量名一般用小写英文字母。变量定义的一般格式: 存储类型存储类型 数据类型数据类型 变量名变量名1, 变量名变量名2; 例如,int sum, number, a,b;在定义变量的同时对变量进行赋初值的操作称为变量初始化。变量初始化的一般格式:存储类型存储类型 数据类型数据类型 变量名变量名1=初值初值1, 变量名变量名2=初值初值2;例如,float r

4、adius=2.5, length=3.6, area; 整型常量即整常数,在语言中,整型常量可用三种形式表示:(1)十进制,例如10、36、0、-789。(2)八进制(以数字开头),例如0127,即(127)8,等于十进制的87。(3)十六进制(以数字+小写字母x开头),例如0 x36, 即(36)16, 等于十进制的54。根据变量的取值范围整型变量可分为:基本整型(类型关键字为int)短整型(类型关键字为short int)长整型(类型关键字为long int)。 对以上三种都可以加上修饰符unsigned,以指定是“无符号数”。不加修饰符unsigned的,隐含是有符号(signed),

5、signed可以不写。归纳起来,整型变量有以下6种:有符号基本整型 signed int无符号基本整型 unsigned int有符号短整型 signed short int无符号短整型 unsigned short int有符号长整型 signed long int无符号长整型 unsigned long int例如,下面分别定义了有符号基本整型变量a和b、无符号长整型变量c和d: int a,b; unsigned long c,d; 有符号整数: 无符号整数:符号位:表示该数的正负符号,不能表示数值的大小0:正1:负(无符号位,所有位都用来表示数值的大小)1111111111111111

6、111111111111111165535-1 C标准没有具体规定以上各类数据所占内存大小,只要求long型数据不短于int型,short型不长于int型,怎样实现由计算机系统自行决定。 ANSI标准定义的各种整数类型和有关数据标准定义的各种整数类型和有关数据-3276832767 即 215 (215-1)065535 即 0 (216-1)-3276832767 即 215 (215-1)065535 即 0 (216-1)-21474836482147483647 即 231 (231-1)04294967295 即 0 (232-1)222244signed intunsigned i

7、ntsigned short intunsigned short intsigned long int unsigned long int取值范围字节数类型 可以使用scanf函数和printf函数进行数据的输入输出。 scanf函数的功能是按照指定格式将标准输入设备输入的内容送入变量中,printf函数的功能是按照指定格式在标准输出设备上显示数据。“指定格式”需要使用格式说明符%和格式字符,显示整型数的格式字符有英文字母d、o、x、u等。 %d表示把数据按十进制整型输入(输出);%o表示把数据按八进制整型输入(输出);%x表示把数据按十六进制整型输入(输出);%u表示把数据按无符号整型输入(

8、输出)。 除了%d格式之外,上面的其余几种格式都将数据作为无符号数输入(输出)。如果输入(输出)的是长整型数,一定要在转换字符的前面加字符l,否则显示可能不对。例例2.1 整型数据的输出。#include int main() int a=427,b=68,c; c=15+a+b; printf(%d,%d,%d,%dn, a,b,c,a-b-34); printf(%o,%o,%o,%on, a,b,c,a-b-34); printf(%x,%x,%x,%xn, a,b,c,a-b-34); getch(); return 0; 演示程序2_1例例2.2 整型数据的输入。#include i

9、nt main() int a,b,c; unsigned d;long e; scanf(%d,%o,%x,%u,%ld , &a,&b,&c,&d,&e); printf(%d,%d,%d,%u,%ld n, a,b,c,d,e); getch(); return 0; 演示程序2_2 实数又称浮点数,有两种表示形式: (1)十进制小数形式:十进制小数形式:由数字和小数点组成(必须有小数点),例如3.14159、0.0、9.0、.12345、-9.8等。 (2)指数形式:指数形式:E(或e)。例如1.23E3、2.71e-5(分别代表1.23103、2.7110-5)等。注意:E(或e)的

10、两边必须有数字,且后面的指数必须是整数。 一个实数有多种指数表示形式。例如314.159可以表示为3141.59E-1、314.159E0、3.14159E2、0.314159E3等,把其中的3.14159E2称为“规范化的指数形式”,即小数点左边有且只有一位非零数字。 实型变量分为单精度型和双精度型,有的C版本还支持长双精度型(long double)。(1)单精度型。类型说明符为float,在内存中占个字节(32位),有效数字的个数是位十进制数字,数值范围-3.410-383.4 1038 。(2)双精度型。类型说明符为double,在内存中占个字节(64位),有效数字的个数是15位十进制

11、数字,数值范围-1.710-3081.7 10308 。 可以使用%f和%e控制输入(输出)float类型的数据,使用%lf和%le控制输入(输出)double类型的数据。例例2.3 实型数据的输入输出。#include int main() float a,b;double x,y; scanf(%f,%e,%lf,%le, &a,&b,&x,&y); printf(%f,%e,%lf,%le n, a,b,x,y); getch(); return 0; 演示程序2_3 C的字符型常量是用一对单引号括起来的单个字符,例如,A、3、a、?等都是字符型常量。注意A和a是不同的。 还有一种特殊形

12、式的字符型常量,就是以转义符“”开头的一些字符构成的转义序列。例如n,它表示“回车换行”。 常见转义字符及其含义常见转义字符及其含义 警告声退格,将当前位置移到前一列换页,将当前位置移到下一页开头换行,将当前位置移到下一行开头回车,将当前位置移到本行开头横向跳格,跳到下一个tab位置反斜线字符单撇号字符双撇号字符1到3位8进制数所代表的字符1到2位16进制数所代表的字符字符串终止字符abfnrt”dddxhh0含义字符形式例例2.4 转义字符的使用#include int main() printf(A102x43DEtbb343x61x62x3n); printf(A53101tb41521

13、41142x63x64n); getch(); return 0;演示程序2_4 字符串常量是用一对双引号括起来的若干字符序列。例如:“How are you”,“No.345”。C编译程序在存储字符串常量时自动采用字符0作为字符串结束标志,它不引起任何控制动作,也不是一个可显示的字符。因此,字符串“Good”在内存中要占5个字节数,而不是4个,如下所示:注意:注意:A和“A”是不同的,A是字符常量,在内存占1个字节数;“A”字符串常量,在内存占2个字节数,包含A和0两个字符。 字符变量的类型说明符为char。 例如:“char c1,c2;”表示定义了两个字符变量。 字符变量用来存储字符常量

14、,一个字符变量只能存储1个字符,即只能存储1个字节的信息,就是说一个字符变量在内存中占一个字节。 例如用如下语句给上面定义的字符变量c1、c2赋值: c1=A;c2=B; 将一个字符常量放到一个字符变量中,实质上是将该字符常量对应的ASCII代码放到了字符变量中,系统为字符变量所分配的一个字节的存储单元中,存放的是该字符常量的二进制形式的ASCII代码,例如A的ASCII代码是65,65的二进制形式是01000001,所以系统为c1所分配的一个字节中,存放的是01000001。因此,字符数据与整型数据可以互相赋值和输入输出。 可以使用%c控制输入(输出)char类型的数据。例例2.5 字符变量

15、值的输入输出。#include int main() char c1,c2; char c3=P; scanf(%c ,&c1); c2=D; printf(%c%c%c ,c1,c2,c3); printf(,%c,%c,%c n ,c1,c2,c3); getch(); return 0;演示程序2_5 例例2.6 大写字符转换为小写字符。#include int main() char c1,c2; scanf(%c,%c,&c1,&c2); printf(%c%cn,c1,c2); c1=c1+32;c2=c2+32; printf(%c,%cn ,c1,c2); getch(); r

16、eturn 0; 演示程序2_6基本的算术运算符有如下五种:+(加法运算符、或正值运算符,如13+25、+9);-(减法运算符、或负值运算符,如32-15、-2);*(乘法运算符,如4*7、5.6*7.8);/(除法运算符,如32/5、1.23/3.45);%(求余数运算符,或称取模运算符,如8%5的值为3)。 关于除法运算符/:若是两个整数相除,其商为整数,小数部分被舍弃;若除数和被除数中有一个是浮点数(实数),则与数学的运算规则相同。 关于求余数运算符:要求两侧的操作数均为整型数据,结果的符号与%左边的符号相同。可以利用%运算来判断一个数能否被另一个数整除。 1算术表达式的概念 用算术运算

17、符和圆括号将运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子,称为C算术表达式。 单个常量、变量或函数,可以看作是表达式的一种特例。 例如数学表达式(2x+3y)(4xy),写成语言的算术表达式,应该是:(2*x+3*y)/(4*x*y),或(2*x+3*y)/4/x/y,不能是(2x+3y)/(4xy),也不能是2*x+3*y/(4*x*y),也不能是(2*x+3*y)/4*x*y。 1算术表达式的概念 算术表达式的结果不应超过其能表示的数的范围。例如整型数的范围是-32768至32767,下面程序中的算术表达式x+y显然是错的,因为超过了32767。main() int x

18、,y;x=31500;y=24600;printf(“%d”,x+y); 若将x和y定义为长整型,就没有问题了。仅将d改成ld也不可以。2算术运算符的优先级与结合性 表达式求值时,按运算符的优先级别高低,按次序执行。算术运算符的优先级是:先乘除,后加减;求余数运算的优先级与乘除相同;函数和圆括号的优先级最高。 所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合?自左至右的结合方向,称为左结合性。反之,称为右结合性。 算术运算符的结合方向是“自左至右”,例如:在执行“ab+c”时,变量b先与减号结合,执行“ab”;然后再执行加c的

19、运算。 在语言中,整型、实型和字符型数据间可以混合运算。 如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。有两种转换方式:自动转换强制转换。1自动转换 自动转换就是系统根据规则自动地将两个不同数据类型的运算对象转换成同一数据类型。自动转换又称为隐式转换。 1自动转换注意注意,自动转换只是针对一个运算符两侧的两个运算对象,不能对表达式中的所有运算符涉及到的运算对象做一次性的自动转换。例如,表达式6.0/5+4.32和表达式6/5+4.32,前者的值是5.52,后者的值是5.32。因为6.0/5是先将5转换成f

20、loat型后进行运算,值是1.2,再与4.32相加,值是5.52。而6/5是按int型运算,值是1,再与4.32相加,值是5.32;不要理解成将6/5+4.32中的每个数全部转换成float型后再运算。2强制转换 编写程序时,可以利用强制类型转换运算符将一个表达式的值转换成所需类型,强制转换的格式为: (类型名)(表达式) 例如:(float)a(将a转换成float型。注意不能写成float(a)(int)3.45(将3.45转换成int型)(double)(7%6)(将7%6的值转换成double型)(float)(x+y)(将x+y的值转换成float型。注意注意不能写成(float)x

21、+y) 1普通赋值运算符普通赋值运算符 普通赋值运算符就是“=”,它的作用是将运算符右侧表达式的值赋给运算符左侧的变量。例如“x=1.23”的作用是将常量1.23赋给变量x,“y=3*x+5.26”的作用是将表达式3*x+5.26的值赋给变量y。例如“x= x+1”的作用是:将变量x原来的值加1后再赋给变量x,若变量x原来的值是2,则执行“x= x+1”后,变量x的值是3。 2复合赋值运算符复合赋值运算符 复合赋值运算符是在普通赋值运算符“=”的前面加上其它运算符,复合算术赋值运算符有如下5个: +=、-=、*=、/=、%= 另外还有5种复合赋值运算符(=、&=、=、|=),将在后面其它章中介

22、绍。 复合算术赋值运算符的使用规则为:Xop=Y等价于X=XopY,其中X代表被赋值的某个变量,op代表+或-或*或/或%,Y代表某个表达式。例如:a+=9 等价于 a=a+9b*=c+5 等价于 b=b*(c+5) (注意不等价于b=b*c+5)d/=2*e-7 等价于 d=d/(2*e-7) (注意不等价于d=d/2*e-7) 由变量、赋值运算符和表达式连接起来的式子称为赋值表达式。赋值表达式的值就是被赋值的变量的值。例如,a=123是一个赋值表达式,a=123这个赋值表达式的值就是a的值,而a的值是123,所以a=123这个赋值表达式的值就是123。例如,b+=456也是一个赋值表达式,

23、b+=456这个赋值表达式的值就是b的值,因为b+=456等价于b=b+456,若b的初值是300,则执行b=b+456后,b的值是756,所以b+=456这个赋值表达式的值就是756。下面是赋值表达式的其它几个例子:x=(y=23)+(z=17)-8(x的值是32,所以赋值表达式的值是32)x/=8*(y=2)(若x的初值是32,执行x/=8*(y=2)后,x的值是2,所以赋值表达式的值是2)y1=y2=y3=8(执行y1=y2=y3=8后,y1、y2、y3的值都是8,所以赋值表达式的值是8) 赋值表达式的后面加上分号(;),就成为赋值语句。 赋值表达式也可以在赋值语句之外的其它语句中出现。

24、例如: if (ch=getchar())!= n) printf(“%c”,ch);上面语句中出现了赋值表达式“ch=getchar()” ,ch的值就是赋值表达式ch=getchar()的值,若该值不等于n,则输出ch的值。 当赋值运算符左边的变量数据类型与右边的表达式的数据类型不相同时,需要进行数据类型的转换,系统把右边的数据转换成左边数据类型的数据。 转换后可能会发生数据丢失现象。例如,左边为int型,右边为long型,由于long型在内存中所占二进制位数(32位)大于int型在内存中所占二进制位数(16位),造成long型的高16位无法复制到int型变量中去,因此可能丢失数据。同理,

25、左边为float型,右边为double型,也可能丢失数据。 1整型和字符型之间的转换整型和字符型之间的转换 (1)字符型数据赋给整型变量 由于字符型数据在内存中占8位,而整型变量在内存中占16位,因此将字符型数据的8位放到整型变量的低8位中。对整型变量高8位的处理:有的系统是对整型变量高8位补0;有的系统是根据字符型数据的最高位的值来决定补1还是补0。 例如Turbo C是根据字符型数据的最高位的值来决定补1还是补0。若字符型数据的最高位值为0,则对整型变量高8位补0;若字符型数据的最高位值为1,则对整型变量高8位补1。 1整型和字符型之间的转换整型和字符型之间的转换 (2)整型(int或sh

26、ort或long)数据赋给字符型变量 由于字符型数据在内存中占8位,所以只将整型数据的低8位送到字符型变量中。例如,若将十进制int型数据322赋给字符型变量ch,因为322的二进制形式是0000000101000010,它的低8位是01000010(十进制形式是66),所以字符型变量ch的值的二进制形式是01000010(即66),若执行“printf(“%c”,ch);”语句则输出字符B,因为B的ASCII码是66(十进制)。例如,若将十进制int型数据65赋给字符型变量ch,因为65的二进制形式是0000000001000001,它的低8位是01000001(十进制形式也是65),所以字

27、符型变量ch的值的二进制形式是01000001,若执行“printf(”%c”,ch);” 语句则输出字符A。2整型之间的转换整型之间的转换(1)int型数据赋给long型变量 将int型数据的16位二进制代码送到long型变量的低16位中,如果int型数据值为正(符号位是0),则long型变量的高16位补0;如果int型数据值为负(符号位是1),则long型变量的高16位补1。高16位补0或1称为符号扩展。(2)long型数据赋给int型变量。只将long型数据中的低16位送到int型变量中。(3)unsigned int型数据赋给long int型变量。此时不存在符号扩展问题,只需将lon

28、g int型变量的高位补0即可。2整型之间的转换整型之间的转换(4)unsigned型数据赋给占二进制位数相同的其它整型变量 将unsigned型数据的内容原样送到其它整型变量中,但是如果范围超过其它整型变量允许的范围,则会出错。例如,若a是unsigned int型变量,a=65535,而b是int型变量,若执行“b=a;”,由于a的二进制形式是1111111111111111,所以b的二进制形式也是1111111111111111,由于最高位(符号位)是1,因此b成了负数,根据补码知识,可知b是-1,执行“printf(“%d”,b);”将输出-1。2整型之间的转换整型之间的转换(5)非u

29、nsigned型的整型数据赋给占二进制位数相同的unsigned型变量 此时也是原样照赋(最高的符号位也一起传送)。例如,若a是unsigned int型变量,b是int型变量,b=-1。若执行“a=b;”,由于b的二进制形式是1111111111111111,所以a的二进制形式也是1111111111111111。若执行“printf(“%d”,a);”,将输出65535。 3实型与整型之间的转换实型与整型之间的转换 (1)整型数据赋给实型变量 系统将整型数据转换成单(或双)精度实型数据,保持数值不变,赋值给实型变量。(2)实型数据赋给整型变量 单(或双)精度实型数据赋给整型变量,舍弃实型数

30、据的小数部分,将整数部分赋给整型变量。例如,若n是int型变量,执行“n=5.67;”的结果使n的值为5,执行“printf(“%d”,n);”将输出5。 4实型之间的转换实型之间的转换 (1)float型数据赋给double型变量 此时保持数值不变,存放到double型变量中,在内存中以64位二进制形式存储。 (2)double型数据赋给float型变量 此时截取double型数据的前7位有效数字,存放到float型变量中,在内存中以32位二进制形式存储。此时可能要丢失数据,注意数值范围不要溢出。 自增和自减运算符都是单目运算符,自增运算符+的作用是使变量的值增1,自减运算符-的作用是使变量

31、的值减1。 对于int型变量i,+i和i+都等价于i=i+1,-i和i-等价于i=i-1。 +i和-i是前缀表示法,i+和i-是后缀表示法。前缀表示法是将i值先增/减1,再在表达式中使用;后缀表示法是先在表达式中使用i的值,再将i值增/减1。例例2.7 自增、自减运算符的使用。#include int main() int i,j,k; i=6;j=+i;k=i+; printf(%d,%d,%dn ,j,k,i); i=-6;j=-i;k=i-; printf(%d,%d,%dn ,j,k,i); getch(); return 0; 演示程序2_7要注意注意的几点:(1)自增、自减运算符,

32、不能用于常量和表达式。例如,+6、-(i+3*j)等都是非法的。(2)自增、自减运算符的优先级高于算术运算符,与单目运算符-(取负)和!(逻辑非)的优先级相同,结合方向自右至左。例如-a+等价于-(a+)。(3)像“printf(%d,%d n ,i,i+);”这样出现“i,i+”的语句,在不同的编译系统中结果是不同的。若i的值是6,按从左至右求值,输出“6,6”;按从右至左求值,输出“7,6”。Turbo C是按从右至左求值的。(4)自增或自减运算符最好单独使用,避免自增或自减运算与其它运算符混合使用。像i+j这样的很难理解的表达式,应避免使用。 C语言还提供逗号运算符,逗号将两个表达式连接起来,形成一个表达式,称为逗号表达式。它的一般形式如下: 表达式1,表达式2 逗号表达式的求值过程是:先求表达式1的值,再求表达式2的值,将表达式2的值作为逗号表达式的值。例如,逗号表达式“8-3,6+5”的值是11。例如,逗号表达式“k=2*3,+k”的值是7。注意注意,赋值运算符的优先级高于逗号运算符,所以“k=2*3,+k”是逗号表达式,不要将其理解为“k=(2*3,+k)”。例如,逗号表达式“a=6,a+

温馨提示

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

评论

0/150

提交评论