《c语言课件第二章数据类型运算符与表达式.ppt》由会员分享,可在线阅读,更多相关《c语言课件第二章数据类型运算符与表达式.ppt(69页珍藏版)》请在金锄头文库上搜索。
1、第二章第二章数据类型数据类型运算符和表达式运算符和表达式2.1 2.1 C C的数据的数据类型型 能能被被计计算算机机处处理理的的信信息息称称为为数数据据(data)。在在计计算算机机科科学学领领域域中中,数数据据是是广广义义的的。数数值值、字字符符、文文字字、表表格格、图图形形和和图图像、声音等都是数据。像、声音等都是数据。程序、算法处理的对象是数据。程序、算法处理的对象是数据。 C C语语言言中中数数据据是是有有类类型型的的,数数据据的的类类型型简简称称数数据据类类型型。在在C语语言言中中讨讨论论数数据据,总总是是把把数数据据的的表表示示、数数据据值值和和数数据据类类型型作作为一个整体考察
2、。为一个整体考察。第二章第二章数据类型数据类型运算符和表达式运算符和表达式2.1 2.1 C C的数据的数据类型型 2.1 2.1 C C的数据的数据类型型注意注意:1 1、不同数据类型有不同的取值范围、不同数据类型有不同的取值范围P43(P43(表表3-1),3-1),p46(p46(表表3-2)3-2)。2 2、不同的编译系统,数据分配字节不同。例如、不同的编译系统,数据分配字节不同。例如TC P43(TC P43(表表3-1)3-1)中中int int 型数据分配型数据分配2 2个字节(个字节(1616位),而位),而VC+6.0VC+6.0中中intint型数据分配型数据分配4 4个字
3、节个字节(3232位)。位)。3 3、不同的数据类型有不同的操作。、不同的数据类型有不同的操作。如整型数可以取余操作,如整型数可以取余操作,实型数型数据却不行;整型、据却不行;整型、实型数据可以有加法,字符数型数据可以有加法,字符数组不行。不行。 4 4、不同的数据类型即使有相同的操作有时含义也不同,如指针数、不同的数据类型即使有相同的操作有时含义也不同,如指针数据自增据自增1 1与整数自增与整数自增1 1含义是不同的。含义是不同的。2.1 2.1 C C的数据的数据类型型注意注意:5 5、不同的数据类型对计算机可能出现的错误不同。如整型数的、不同的数据类型对计算机可能出现的错误不同。如整型数
4、的溢出错误,浮点数的精度的丢失(有效数字位数不够)。溢出错误,浮点数的精度的丢失(有效数字位数不够)。6 6、C C语言的数据类型可以构造复杂的数据结构。如使用结构体数语言的数据类型可以构造复杂的数据结构。如使用结构体数组可以构造线性表。使用指针类型、结构体类型可以构造线性链组可以构造线性表。使用指针类型、结构体类型可以构造线性链表(栈、队列)、树、图。(在数据结构课程介绍)表(栈、队列)、树、图。(在数据结构课程介绍)2.2常量与变量常量与变量2 2、2 2、1 1 常量常量:在程序的运行过程中,其值不能改变的量称为常量。它相:在程序的运行过程中,其值不能改变的量称为常量。它相当于数学中的常
5、数。当于数学中的常数。在在C语言中,常量可以分为语言中,常量可以分为一般常量一般常量和和符号常量符号常量两类。两类。1.常量的使用(一):常量的使用(一):2 2、2 2、1 1 常量:常量:2.常量的使用(二)常量的使用(二)符号常量的使用:符号常量的使用: #define PI 3.1416 #include void main( ) float s,l; s=10*10*PI; l=2* PI*10; printf(“s=%fn,l=%fn,s,l); printf(“PI=%fn,PI) PI也是一个常量,称为符号常也是一个常量,称为符号常量,它由量,它由#define命令定义,命令定
6、义,代表代表3.1416。该程序在编译之。该程序在编译之前,会自动将程序中所有的前,会自动将程序中所有的PI替换成替换成3.1416。这样程序将等。这样程序将等价于后面(三)的程序。价于后面(三)的程序。2 2、2 2、1 1 常量:常量:3. 常量的使用(三):常量的使用(三): #include void main( ) float s,l; s=10*10*3.1416; l=2* 3.1416*10; printf(“s=%fn,l=%fn,s,l); printf(“PI=%fn,3.1416) 由于替换命令都是由于替换命令都是在编译之前进行的,所在编译之前进行的,所以类似于以类似于
7、#define 这样这样的命令被称之为的命令被称之为预处理预处理命令命令。(例如。(例如 #include )预处理命令的命令行)预处理命令的命令行一般都是放在源程序中一般都是放在源程序中最前面的说明部分。最前面的说明部分。2 2、2 2、1 1 常量:常量:使用符号常量的好处:(使用符号常量的好处:(1)含义清楚、见名知意。)含义清楚、见名知意。(2)修改方便、一改全改)修改方便、一改全改。思考:同是常量,符号常量在程序设计中有什么优势?思考:同是常量,符号常量在程序设计中有什么优势?2 2、2 2、2 2 变量变量 在程序的运行过程中,其值可以改变的量称在程序的运行过程中,其值可以改变的量
8、称为为变量变量。1、变变量量名名(用用标标识识符符表表示示)、变变量量在在内内存存中中占占据据的的存存储储单单元元、变变量量值三者关系。值三者关系。变变量量名名在在程程序序运运行行过过程程中中不不会会改改变变,变变量量的的值值可可以以改改变变。 变变量量名遵守标识符准则名遵守标识符准则。2 2、2 2、2 2 变量变量2、变量的定义格式:变量的定义格式:变量类型变量类型变量名;变量名;intnum;2 2、2 2、2 2 变量变量3、变量的特性变量的特性2 2、2 2、2 2 变量变量4、变量:变量:“先定义,后使用先定义,后使用”。1)只只有有定定义义过过的的变变量量才才可可以以在在程程序序
9、中中使使用用,这这使使得得变变量量名名的的拼拼写错误容易发现。写错误容易发现。2)定定义义过过的的变变量量属属于于确确定定的的类类型型,编编译译系系统统可可方方便便地地检检查查变变量量所进行运算的合法性。所进行运算的合法性。 3 3)在编译时根据变量类型可以为变量确定存储空间,)在编译时根据变量类型可以为变量确定存储空间,“先定先定义后使用义后使用”使程序效率高。使程序效率高。2 2、2 2、2 2 变量变量例(例(200903)12.若函数中有定义语句若函数中有定义语句:intk;,则则A)系统将自动给系统将自动给k赋初值赋初值0B)这是这是k中的值无定义中的值无定义C)系统将自动给系统将自
10、动给k赋初值赋初值-1D)这时这时k中无任何值中无任何值2、3 整型数据整型数据2.3.1整型常量的表示方法整型常量的表示方法1)十进制。例如)十进制。例如123,-456,0。2)八进制。以)八进制。以0开头,后面跟几位的数字(开头,后面跟几位的数字(0-7)。)。例如:例如:0123=(123)8=(83)10;-011=(-11)8=(-9)10。3)十六进制。以)十六进制。以0x开头,后面跟几位的数字(开头,后面跟几位的数字(0-9,A-F)。)。注意:注意:AF(af)是不区分大小写的。是不区分大小写的。例如:例如:0x123=291,-0x12=-18,0xF=15。2.3.1整型
11、常整型常量量的表示方法的表示方法4)整整型型常常量量的的类类型型(整整型型常常数数的的后后缀缀,在在整整型型变变量量部部分分介介绍绍,这这里只要知道怎么表示)。里只要知道怎么表示)。整型常量后缀可以用:整型常量后缀可以用:u或或U明确说明为无符号整型数明确说明为无符号整型数l或或L明确说明为长整型数明确说明为长整型数.例如:例如:123L,123ul,123u,123UL2.3.1整型常量的表示方法整型常量的表示方法1 1、以下选项中可作为、以下选项中可作为C C语言合法整数的是语言合法整数的是A A)10110B B10110B B)0386 0386 C C)0Xffa0Xffa D D)
12、x2a2x2a22 2、与十六进制数与十六进制数200200等值得十进制数为()等值得十进制数为() A)256A)256B)512B)512C)1024C)1024D)2048D)20482.3.2整型变量整型变量1、整型数据在内存中的存放形式、整型数据在内存中的存放形式数据在内存中以二进制形式存放,事实上以补码形式存放。数据在内存中以二进制形式存放,事实上以补码形式存放。例如:定义一个整型变量例如:定义一个整型变量i=10,补充知识(参考计算机文化基础等课程):补充知识(参考计算机文化基础等课程):1)带符号数的表示,原码、反码、补码。)带符号数的表示,原码、反码、补码。2)原原码码-补补
13、码码相相互互转转化化。正正数数的的补补码码与与其其原原码码相相同同,负负数数的的补补码码是是其其对对应应的的绝对值的原码数值位按位取反绝对值的原码数值位按位取反+1。2.3.2整型变量整型变量例题:例题:10,-10的计算机机内表示。的计算机机内表示。思思路路:先先将将数数值值表表示示为为二二进进制制形形式式(十十进进制制=二二进进制制,除除2取取余余),即获得数值的原码。将原码转化为补码,就是机内表示。,即获得数值的原码。将原码转化为补码,就是机内表示。10=(1010)2=(0000,0000,0000,1010)原原=(0000,0000,0000,1010)补。补。-10=(-1010
14、)2=(1000,0000,0000,1010)原原=(1111,1111,1111,0110)补。补。从从10,-10的的计计算算机机机机内内表表示示可可以以看看出出正正数数、负负数数机机内内表表示示(补补码码表表示)看上去明显不同。示)看上去明显不同。2.3.2整型变量整型变量2、整型变量的分类、整型变量的分类整整型型变变量量的的基基本本类类型型为为int。通通过过加加上上修修饰饰符符,可可定定义义更更多多的的整整数数据类型。数数据类型。归纳起来可以用归纳起来可以用6种整型变量种整型变量:l有符号基本整型有符号基本整型:signedintl有符号短整型有符号短整型:signedshorti
15、ntl有符号长整型有符号长整型:signedlongintl无符号基本整型无符号基本整型:unsignedintl无符号短整型无符号短整型:unsignedshortintl无符号长整型无符号长整型:unsignedlongint2.3.2整型变量整型变量2、整型变量的分类、整型变量的分类1)根根据据表表达达范范围围可可以以分分为为:基基本本整整型型(int)、短短整整型型(short)、长长整整型型(long)。用用long型型可可以以获获得得大大范范围围的的整整数数,但但同同时时会会降降低低运运算速度。算速度。2)根根据据是是否否有有符符号号可可以以分分为为:有有符符号号(signed,默
16、默认认),无无符符号号(unsigned)-目的:扩大表示范围,有些情况只需要用正整数。目的:扩大表示范围,有些情况只需要用正整数。有有符符号号整整型型数数的的存存储储单单元元的的最最高高位位是是符符号号位位(0:正正、1:负负),其其余余为为数数值值位位。无无符符号号整整型型数数的的存存储储单单元元的的全全部部二二进进制制位位用用于于存存放放数数值本身而不包含符号。值本身而不包含符号。C标标准准没没有有具具体体规规定定上上面面数数据据类类型型所所占占用用的的字字节节数数,只只要要求求long型型数数据据长长度度不不短短于于int型型,short型型不不长长于于int型型。具具体体如如何何实实
17、现现,由由各各计计算算机机系系统统自自行行决决定定。如如微微机机上上short,int都都是是16位位,而而long是是32位;位;VAX750机,机,int,long都是都是32位,而位,而short是是16位。位。2.3.2整型变量整型变量2、整型变量的分类、整型变量的分类(p43表表3.1)2.3.2整型变量整型变量2、整型变量的分类、整型变量的分类例子:保存整数例子:保存整数1313的各种整型数据类型。的各种整型数据类型。2.3.2整型变量整型变量3、整型变量的定义、整型变量的定义格式:变量类型格式:变量类型 变量名变量名 表表 ;例如:例如:#includevoidmain()int
18、a,b,c,d;unsignedu;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=-142.3.2整型变量整型变量3、整型变量的定义、整型变量的定义说明:说明: (1) (1)变量定量定义时,可以,可以说明多个相同明多个相同类型的型的变量。各个量。各个变量量用用“,”分隔。分隔。类型型说明与明与变量名之量名之间至少有一个空格至少有一个空格间隔。隔。(2 2)最后一个变量名之后必须用)最后一个变量名之后必须用“;”结尾。结尾。(3 3)变量必须先定义后使用。)变量必须先定义后使用。 (4) (4)
19、也可以在定也可以在定义变量的同量的同时,对变量量进行初始化。行初始化。 2.3.2整型变量整型变量3、整型变量的定义、整型变量的定义例例2-2:变量初始化量初始化#includevoidmain()inta=3,b=5;printf(a+b=%dn,a+b);2.3.2整型变量整型变量4、整型数据的溢出整型数据的溢出 整整型型数数最最大大允允许许值值+1+1,最最小小允允许许值值-1-1,会会出出现现什什么么情情况况? ? 例如:例如:32767+1=-3276832767+1=-32768;-32768-1=32767-32768-1=32767。例例2-2a:整型数据的溢出整型数据的溢出#
20、includevoidmain()inta,b;a=32767;b=a+1;printf(na=%d,a+1=%dn,a,b);a=-32768;b=a-1;printf(na=%d,a-1=%dn,a,b);结果:结果:a=32767,a+1=-32768a=-32768,a-1=32767超出范围就发生超出范围就发生超出范围就发生超出范围就发生“ “溢出溢出溢出溢出” ”,运行时不报错,运行时不报错,运行时不报错,运行时不报错。2.4 2.4 实型(浮点型)数据实型(浮点型)数据2、4、1实型常量的表示方法实型常量的表示方法实数(浮点数)有两种表示形式实数(浮点数)有两种表示形式: 1 1
21、、十进制小数形式。由数字,小数点组成(必须有小数点)。、十进制小数形式。由数字,小数点组成(必须有小数点)。 例如:例如:.123.123、123.123.、123.0123.0、0.00.0 2 2、指数形式。格式:指数形式。格式:aEnaEn。 例如:例如:123123e3e3、123E3123E3都是实数的合法表示。都是实数的合法表示。2、4、1实型常量的表示方法实型常量的表示方法指数形式指数形式注意:注意:1)字母)字母e(或或E)前面必须有数字,后面必须为整数。前面必须有数字,后面必须为整数。例如:例如:e3、2.1e3.5、.e3、e都不是合法的指数形式。都不是合法的指数形式。2)
22、规规范范化化的的指指数数形形式式。在在字字母母e或或E之之前前的的小小数数部部分分,小小数数点点左左边边应应当当有有且且只只能能有有一一位位非非0数数字字。用用指指数数形形式式输输出出时时,是是按按规规范范化化的的指数形式输出的。指数形式输出的。例如:例如:2.3478e2、3.0999E5、6.46832e12都属于规范化的指数形式。都属于规范化的指数形式。3)实实型型常常量量都都是是双双精精度度,如如果果要要指指定定它它为为单单精精度度,可可以以加加后后缀缀f(实型数据类型参看实型变量部分说明)。实型数据类型参看实型变量部分说明)。2、4、1实型常量的表示方法实型常量的表示方法1 1、以下
23、符合以下符合C C语言语法的实型常量是()语言语法的实型常量是()A)1.2E0.5B)3.14.159EA)1.2E0.5B)3.14.159EC)C).5E-.5E-3D)E153D)E15(13).一下选项中一下选项中,能用作数据常量的是能用作数据常量的是(200903)A)o115B)0118C)1.5e1.5D)115L2、4、2实型变量实型变量1.1.实型数据在内存中的存放形式实型数据在内存中的存放形式 一个实型数据一般在内存中占一个实型数据一般在内存中占4 4个字节(个字节(3232位)。与整数存储位)。与整数存储方式不同,实型数据是按照指数形式存储的。系统将实型数据分为方式不同
24、,实型数据是按照指数形式存储的。系统将实型数据分为小数部分和指数部分,分别存放。小数部分和指数部分,分别存放。实型数据存放的示意实型数据存放的示意图 :标标准准C没没有有规规定定用用多多少少位位表表示示小小数数,多多少少位位表表示示指指数数部部分分,由由C编编译译系系统统自自定定。例例如如,很很多多编编译译系系统统以以24位位表表示示小小数数部部分分(包包括括符符号号),8位位表表示示指指数数部部分分(包包括括指指数数的的符符号号)。小小数数部部分分占占的的位位数数多多,实实型型数数据据的的有有效效数数字字多多,精精度度高;指数部分占的位数多,则表示的数值范围大。高;指数部分占的位数多,则表示
25、的数值范围大。 2 2、实型变量的分类、实型变量的分类 实实型型变变量量分分为为:单单精精度度( (float)float)、双双精精度度( (double)double)、长长双双精精度度( (long double)long double)。 ANSI CANSI C没有规定每种数据类型的长度、精度和数值范围。下表列出没有规定每种数据类型的长度、精度和数值范围。下表列出微机上常用的微机上常用的C C编译系统的情况。编译系统的情况。对于每一个实型变量也都应该先定义后使用。如对于每一个实型变量也都应该先定义后使用。如:类型类型比特数比特数有效数字有效数字数值范围数值范围float326-7-3
26、.4x10+383.4x10+38double6415-16-1.7x10+3081.7x10+308longdouble12818-19-1.2x10+49321.2x10+4932floatx,y;doublez;longdoublet; 3 3、实型数据的舍入型数据的舍入误差(差(对比:整型数据的溢出比:整型数据的溢出 ) ) 实实型型变变量量是是用用有有限限的的存存储储单单元元存存储储的的,因因此此提提供供的的有有效效数数字字是是有有限限的,在有效位以外的数字将被舍去,由此可能会产生一些误差。的,在有效位以外的数字将被舍去,由此可能会产生一些误差。例例2-3a:实型数据的舍入误差(实型
27、变量只能保证实型数据的舍入误差(实型变量只能保证7位有效数字,后面的数位有效数字,后面的数字无意义)字无意义)#includevoidmain()floata,b;a=123456.789e5;b=a+20;printf(a=%f,b=%fn,a,b);printf(a=%e,b=%en,a,b);结果:结果:a=12345678848.000000,b=12345678848.000000a=1.23457e+10,b=1.23457e+10 3 3、实型数据的舍入型数据的舍入误差(差(对比:整型数据的溢出比:整型数据的溢出 ) )结论:结论:由于实数存在舍入误差,使用时要注意:由于实数存在
28、舍入误差,使用时要注意: ( (a)a)不要试图用一个实数精确表示一个大整数,记住:浮点数是不精确的。不要试图用一个实数精确表示一个大整数,记住:浮点数是不精确的。 ( (b)b)实数一般不判断实数一般不判断“相等相等”,而是判断接近或近似。,而是判断接近或近似。 ( (c)c)避免直接将一个很大的实数与一个很小的实数相加、相减,否则会避免直接将一个很大的实数与一个很小的实数相加、相减,否则会“丢失丢失”小的数。小的数。 ( (d)d)根据要求选择单精度、双精度。根据要求选择单精度、双精度。例例2-42-4:根据精度要求,选择实数类型:根据精度要求,选择实数类型#include void ma
29、in() void main() float a; float a; double b; double b; a=33333.33333; a=33333.33333; b=33333.3333333; b=33333.3333333; printfprintf(a=%f,b=%fn,a,b);(a=%f,b=%fn,a,b); 2 2、5 5 字符型数据字符型数据2、5、1字符常量字符常量字符常量字符常量是用单引号(是用单引号()括起来的一个字符。)括起来的一个字符。字符常量主要用下面几种形式表示:字符常量主要用下面几种形式表示:1、直直接接用用单单引引号号括括起起来来一一个个字字符符(可可
30、显显示示的的字字符符),如如,a、x、D、$、?、a、A、1、 、等都是字符常量。等都是字符常量。n错例,错例,abc、我我2、字符的转义表示法(、字符的转义表示法(ASCII码表示)。码表示)。(1)、预先定义的一部分常用的转义字符。如)、预先定义的一部分常用的转义字符。如n-换行,换行,t-水平制表。水平制表。书书P48页表页表3.3,记忆,记忆(2)转转义义表表示示格格式式:ddd或或xhh(其其中中ddd,hh是是字字符符的的ASCII码码,ddd是是1到到3位位8进进制制数数ASCII码码代代表表的的字字符符、hh是是1到到2位位16进进制制数数ASCII码码代代表表的的字字符符)。
31、注意:不可写成。注意:不可写成0xhh或或0ddd(整数整数)。举例:举例:101:代表字母:代表字母A;040:代表空格符;代表空格符;0或或000:代表空操作符,即空字符,代表空操作符,即空字符,ASCII码为码为0。x3A 2、5、1字符常量字符常量例:例:2.5.1转义字符的使用转义字符的使用#includevoidmain()printf( ab ct derftgn);printf(“htibbj kn);2 2、5 5 字符型数据字符型数据2、5、2字符变量字符变量 字字符符型型变变量量是是用用来来存存放放字字符符数数据据,且且只只能能存存放放一一个个字字符符。所所有有编编译译系
32、系统统都都规规定定一一个个字字符符变变量量在在内内存存中中占占一个字节。一个字节。字符变量定义形式:字符变量定义形式:charcl,c2;c1=a;c2=b;2、5、3 3字符数据在内存中的存储形式及其使用字符数据在内存中的存储形式及其使用将一个字符常量存放到字符变量中,是将该字符的将一个字符常量存放到字符变量中,是将该字符的ASCII码存放到存储单元中。码存放到存储单元中。2、5、3 3字符数据在内存中的存储形式及其使用字符数据在内存中的存储形式及其使用可可以以看看出出字字符符数数据据以以ASCII码码存存储储的的形形式式与与整整数数的的存存储储形形式式类类似似,这使得字符型数据和整型数据之
33、间可以通用(当作整型量)。这使得字符型数据和整型数据之间可以通用(当作整型量)。具体表现为:具体表现为:1、可可以以将将整整型型量量赋赋值值给给字字符符变变量量,也也可可以以将将字字符符量量赋赋值值给给整整型型变量。变量。2、可可以以对对字字符符数数据据进进行行算算术术运运算算(即即对对它它们们的的ASCII码码进进行行算算术术运算)。运算)。3、一一个个字字符符数数据据既既可可以以以以字字符符形形式式输输出出(ASCII码码对对应应的的字字符符),也可以以整数形式输出(直接输出,也可以以整数形式输出(直接输出ASCII码)。码)。注注意意:尽尽管管字字符符型型数数据据和和整整型型数数据据之之
34、间间可可以以通通用用,但但是是字字符符型型只只占占1个个字字节节,即即如如果果作作为为整整数数使使用用范范围围0-255(无无符符号号),-128-127(有符号)。(有符号)。2、5、3 3字符数据在内存中的存储形式及其使用字符数据在内存中的存储形式及其使用例例2-72-7a a:给字符变量赋以整数(字符型、整型数据通用给字符变量赋以整数(字符型、整型数据通用 turbo c -128-127turbo c -128-127)#include“stdio.h”voidmain()/*字符字符a的各种表达方法的各种表达方法*/charc1=a;charc2=x61;/*note:x.,.*/c
35、harc3=141;charc4=97;charc5=0x61;/*note:0x.,0.*/charc6=0141;printf(nc1=%c,c2=%c,c3=%c,c4=%c,c5=%c,c6=%cn,c1,c2,c3,c4,c5,c6);printf(c1=%d,c2=%d,c3=%d,c4=%d,c5=%d,c6=%dn,c1,c2,c3,c4,c5,c6);c1=a,c2=a,c3=a,c4=a,c5=a,c6=ac1=97,c2=97,c3=97,c4=97,c5=97,c6=97 过程:整型数过程:整型数=机内表示机内表示( (两个字节两个字节)=)=取低取低8 8位赋值给字符
36、变量位赋值给字符变量2、5、3 3字符数据在内存中的存储形式及其使用字符数据在内存中的存储形式及其使用例例2-82-8a a:大大小小写写字字母母的的转转换换(ASCIIASCII码码表表:小小写写字字母母比比对对应应的的大大写写字字母母的的ASCIIASCII码码大大3232,本本例例还还可可以以看看出出允允许许字字符符数数据据与与整整数数直直接接进进行行算算术术运运算算,运运算算时时字字符符数数据据用用ASCIIASCII码码值参与运算)值参与运算)#includevoidmain()charc1,c2,c3;c1=a;c2=b;c1=c1-32;c2=c2-32;c3=130;print
37、f(n%c%c%cn,c1,c2,c3);printf(%d%d%dn,c1,c2,c3);AB?6566126(此时如何处理?此时如何处理?)(p52页页)2、5、4字符串常量字符串常量字符串常量:是一对双引号(字符串常量:是一对双引号(“”)括起来的字符序列。)括起来的字符序列。例如:例如:“Howdoyoudo?”,“CHINA”,“a”,“$123.45”.注意:注意:1、区分字符常量与字符串常量。如、区分字符常量与字符串常量。如a和和“a”。C语语言言规规定定:在在每每个个字字符符串串的的结结尾尾加加一一个个“字字符符串串结结束束标标志志 ”, 以以 便便 系系 统统 据据 此此 判
38、判 断断 字字 符符 串串 是是 否否 结结 束束 。 C规规 定定 以以0(ASCII码为码为0的字符)作为字符串结束标志。的字符)作为字符串结束标志。如:如:“CHINA”在内存中的存储应当是:(在内存中的存储应当是:(长度长度=6)CHINA02、5、4字符串常量字符串常量2、不能将字符串赋给字符变量。、不能将字符串赋给字符变量。如:如:charc;c=a;(正确正确)c=“a”(错误错误)3、C语语言言没没有有专专门门的的字字符符串串变变量量,如如果果想想将将一一个个字字符符串串存存放放在在变变量量中中,可可以以使使用用字字符符数数组组。即即用用一一个个字字符符数数组组来来存存放放一一
39、个个字符串,数组中每一个元素存放一个字符。字符串,数组中每一个元素存放一个字符。2 2、6 6 变量赋初值变量赋初值程程序序中中常常常常需需要要对对一一些些变变量量预预先先设设置置初初值值,C语语言言允允许许在在定定义义变量的同时使变量初始化。变量的同时使变量初始化。例如:例如:inta=3;/*指定指定a为整型变量,初值为为整型变量,初值为3*/floatf=3.56;/*指定指定f为实型变量,初值为为实型变量,初值为3.56*/charc=a;/*指定指定c为字符型变量,初值为为字符型变量,初值为a*/2 2、6 6 变量赋初值变量赋初值可以只对定义的一部分变量赋初值可以只对定义的一部分变
40、量赋初值。inta,b=2,c=5;/*指指定定a,b,c为为整整型型变变量量,只只对对b、c初初始始化化,b的初值为的初值为2,c的初值为的初值为5*/ 初始化不是在编译阶段完成的,而是在程序运行时执行本函数初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于有一个赋值语句。时赋予初值的,相当于有一个赋值语句。inta=3;相当于:相当于:inta;a=3;2 2、6 6 变量赋初值变量赋初值 考虑:考虑: int int x=y=z=1;x=y=z=1;是否正确?是否正确?2 2、7 7 各类数值型数据(整型、实型、字符型)的混合运算各类数值型数据(整型、实型、字符型
41、)的混合运算 整型(包括整型(包括int,short,long)和实型(包括和实型(包括float,double)数数据可以混合运算,另外字符型数据和整型数据可以通用,因此,据可以混合运算,另外字符型数据和整型数据可以通用,因此,整整型、实型、字符型数据之间可以混合运算。型、实型、字符型数据之间可以混合运算。例如:表达式例如:表达式10+a+1.5-8765.1234*b是合法的。是合法的。 在进行运算时,在进行运算时,不同类型的数据先转换成同一类型,然后进不同类型的数据先转换成同一类型,然后进行计算行计算,转换的方法有两种:,转换的方法有两种:自动转换(隐式转换);强制转换自动转换(隐式转换
42、);强制转换。2 2、7 7 各类数值型数据(整型、实型、字符型)的混合运算各类数值型数据(整型、实型、字符型)的混合运算1 1、自动转换(隐式转换)自动转换发生在不同类型数据进行、自动转换(隐式转换)自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。转换规则:(参看图)混合运算时,由编译系统自动完成。转换规则:(参看图)2 2、7 7 各类数值型数据(整型、实型、字符型)的混合运算各类数值型数据(整型、实型、字符型)的混合运算注意:注意:(1)类型不同,先转换为同一类型,然后进行运算。)类型不同,先转换为同一类型,然后进行运算。(2)图图中中纵纵向向的的箭箭头头表表示示当当运运算
43、算对对象象为为不不同同类类型型时时转转换换的的方方向向。可可以以看看到到箭箭头头由由低低级级别别数数据据类类型型指指向向高高级级别别数数据据类类型型,即即数数据据总总是是由由低低级级别别向向高高级级别别转转换换。即即按按数数据据长长度度增增加加的的方方向向进进行行,保保证证精精度度不降低。不降低。(3)图图中中横横向向向向左左的的箭箭头头表表示示必必定定的的转转换换(不不必必考考虑虑其其它它运运算算对对象象)。如如字字符符数数据据参参与与运运算算必必定定转转化化为为整整数数,float型型数数据据在在运运算算时时一一律律先先转转换换为为双双精精度度型型,以以提提高高运运算算精精度度(即即使使是
44、是两两个个float型型数数据据相加,也先都转换为相加,也先都转换为double型,然后再相加)。型,然后再相加)。 (4 4)赋值运算,如果赋值号)赋值运算,如果赋值号“=”“=”两边的数据类型不同,赋值号两边的数据类型不同,赋值号右边的类型转换为左边的类型。这种转换是截断型的转换,不会四舍右边的类型转换为左边的类型。这种转换是截断型的转换,不会四舍五入。五入。2 2、7 7 各类数值型数据(整型、实型、字符型)的混合运算各类数值型数据(整型、实型、字符型)的混合运算2、强制转换:、强制转换:强制转换是通过类型转换运算来实现。强制转换是通过类型转换运算来实现。一般形式:(类型说明符)表达式一
45、般形式:(类型说明符)表达式功功能能:把把表表达达式式的的结结果果强强制制转转换换为为类类型型说说明明符符所所表表示示的的类类型。型。例如:例如:(int)a将将a的结果强制转换为整型量。的结果强制转换为整型量。(int)(x+y)将将x+y的结果强制转换为整型量。的结果强制转换为整型量。(float)a+b将将a的内容强制转换为浮点数,再与的内容强制转换为浮点数,再与b相加。相加。说明:说明:(1)类类型型说说明明和和表表达达式式都都需需要要加加括括号号(单单个个变变量量可可以以不不加括号)加括号)(2)无无论论隐隐式式转转换换,强强制制转转换换都都是是临临时时转转换换,不不改改变变数数据本
46、身的类型和值。据本身的类型和值。2 2、7 7 各类数值型数据(整型、实型、字符型)的混合运算各类数值型数据(整型、实型、字符型)的混合运算#includevoid main()void main() float f=5.75; float f=5.75; printfprintf(intint)f=%dn,()f=%dn,(intint)f); )f); /* /* 将将f f的的结结果果强强制制转转换换为为整型,输出整型,输出 */ */ printfprintf(f=%fn,f); /* (f=%fn,f); /* 输出输出f f的值的值 */ */ 结果:结果: ( (intint)f
47、=5)f=5 f=5.750000 f=5.750000例例2-92-9:强制类型转换:强制类型转换2、8算术运算符和算术表达式算术运算符和算术表达式2.8.1C C运算符简介运算符简介 本章主要介绍算术运算符(包括自增自减运算符)、赋值运算符、逗号运算符,其它运本章主要介绍算术运算符(包括自增自减运算符)、赋值运算符、逗号运算符,其它运算符在以后相关章节中结合有关内容陆续进行介绍。算符在以后相关章节中结合有关内容陆续进行介绍。2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 1、算术运算符、算术运算符+(加法运算符。如(加法运算符。如3+5)-(减法运算符或负值运算符。如(减
48、法运算符或负值运算符。如5-2,-3)*(乘法运算符。如(乘法运算符。如3*5)/(除法运算符。如(除法运算符。如5/2,5.0/2)%(模模运运算算符符或或求求余余运运算算符符,%要要求求两两侧侧均均为为整整型型数数据据。如如7%4的值为的值为3)。)。除了负值运算符除了负值运算符-单目运算符外,其它都是双目运算符。单目运算符外,其它都是双目运算符。考虑:考虑:-7%4,7%-4,-7%-4;-3,3,-3C语言规定:语言规定:符号由被除数决定。符号由被除数决定。2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 2、算术表达式、算术表达式算算术术表表达达式式:用用算算术术运运
49、算算符符和和括括号号将将运运算算对对象象(也也称称操操作作数数)连连接接起起来来的的、符符合合C语语法法规规则则的的式式子子,称称为为算算术术表表达达式式。运运算算对对象象可可以以是常量、变量、函数等。是常量、变量、函数等。例如,下面是一个合法的例如,下面是一个合法的C算术表达式。算术表达式。a*b/c-1.5+a;x+sqrt(0.25*y)/(abs(a+b)-3.6).2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 注注意意:C语语言言算算术术表表达达式式的的书书写写形形式式与与数数学学表表达达式式的的书书写写形形式式有一定的区别:有一定的区别:(1)C语言算术表达式的
50、乘号(语言算术表达式的乘号(*)不能省略。)不能省略。例如:数学式例如:数学式b2-4ac,相应的相应的C表达式应该写成:表达式应该写成:b*b-4*a*c。(2)C语言表达式中只能出现字符集允许的字符。语言表达式中只能出现字符集允许的字符。例如例如:数学数学r2相应的相应的C表达式应该写成:表达式应该写成:PI*r*r(其中其中PI是已经定义的符号常量是已经定义的符号常量)。(3)C语言算术表达式不允许有分子分母的形式。语言算术表达式不允许有分子分母的形式。例如例如,(a+b)/(c+d)。(4)C语言算术表达式只使用圆括号改变运算的优先顺序()语言算术表达式只使用圆括号改变运算的优先顺序(
51、)不不要要指指望望用用)。可可以以使使用用多多层层圆圆括括号号,此此时时左左右右括括号号必必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。须配对,运算时从内层括号开始,由内向外依次计算表达式的值。2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 3、(算术)运算符的优先级与结合性、(算术)运算符的优先级与结合性(P.365附录附录C)(1)C语语言言规规定定了了运运算算符符的的“优优先先级级”和和“结结合合性性”。在在表表达达式求值时,先按运算符的式求值时,先按运算符的“优先级别优先级别”高低次序执行。高低次序执行。如如表表达达式式:a-b*c等等价价于于a-(b*
52、c),“*”运运算算符符优优先先级级高高于于“-”运算符。运算符。(2)如果在一个运算对象两侧的运算符的优先级别相同,则按)如果在一个运算对象两侧的运算符的优先级别相同,则按规定的规定的“结合方向结合方向”处理。处理。例如:例如:a-b+c,到底是到底是(a-b)+c还是还是a-(b+c)?(?(b先与先与a参与运参与运算还是先于算还是先于c参与运算参与运算?)查附录查附录C可知:可知:+/-运算优先级别相同,结合性为运算优先级别相同,结合性为“自左向右自左向右”,即就是说,即就是说b先与左边的先与左边的a结合。所以结合。所以a-b+c等价于等价于(a-b)+c。2.8.22.8.2算术运算符
53、和算术表达式算术运算符和算术表达式 (3)在在书书写写多多个个运运算算符符的的表表达达式式时时,应应当当注注意意各各个个运运算算符符的的优优先先级级,确确保保表表达达式式中中的的运运算算符符能能以以正正确确的的顺顺序序参参与与运运算算。对对于于复复杂杂表达式为了清晰起见可以加圆括号表达式为了清晰起见可以加圆括号“()()”强制规定计算顺序。强制规定计算顺序。2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 4 4、自增、自减运算符、自增、自减运算符单目运算符,使变量的值增单目运算符,使变量的值增1或减或减1。如:。如:+i,i+-i,i-注意:注意:(1)+i,-i(前前置置运
54、运算算):先先自自增增、减减,再再参参与与运运算算;i+,i-(后置运算)后置运算):先参与运算先参与运算,再自增、减。再自增、减。例如:例如:i=3,分析分析j=+i;j=i+;(2)自增、减运算符只用于变量,而不能用于常量或表达式。自增、减运算符只用于变量,而不能用于常量或表达式。例如:例如:6+,(a+b)+,(-i)+都不合法。都不合法。(3)+,-的的结结合合方方向向是是“自自右右向向左左”(优优先先级级高高于于算算术术运运算算符)。符)。例如:例如:-i+-(i+)合法。合法。(4)自自增增、自自减减运运算算符符常常用用于于循循环环语语句句中中,使使循循环环变变量量自自动动加加1,
55、也用于指针变量,使指针指向下一个地址。,也用于指针变量,使指针指向下一个地址。2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 5 5、有关表达式使用过程中的问题说明、有关表达式使用过程中的问题说明(1)C运运算算符符和和表表达达式式使使用用灵灵活活,利利用用这这一一点点可可以以巧巧妙妙处处理理许许多多在在其其它它语语言言中中难难以以处处理理的的问问题题。但但是是ANSIC并并没没有有具具体体规规定定表表达达式式中中的的子子表表达达式式的的求求值值顺顺序序,允允许许各各编编译译系系统统自自己己安安排排。这这可可能能导导致致有有些些表表达达式式对对不不同同编编译译系系统统有有不不
56、同同的的解解释释,并并导导致致最最终终结结果的不一致。果的不一致。例例1:a=f1()+f2()中中f1,f2哪个先调用。哪个先调用。例例2:i=3,表表达达式式(i+)+(i+)+(i+)的的值值。有有些些系系统统等等价价3+4+5,TurboC等价等价3+3+3总之,不要写别人看不懂(难看懂)、也不知道系统会怎样执行的总之,不要写别人看不懂(难看懂)、也不知道系统会怎样执行的程序。程序。2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 5 5、有关表达式使用过程中的问题说明、有关表达式使用过程中的问题说明(2)C语语言言有有的的运运算算符符为为一一个个字字符符,有有的的由由
57、两两个个字字符符组组成成,C编编译译系系统统在在处处理理时时尽尽可可能能多多地地将将若若干干字字符符组组成成一一个个运运算算符符(在在处处理理标标识识符符、关关键键字字时时也也按按同同一一原原则则处处理理)。如如i+j将将解解释释为为(i+)+j而而不不是是i+(+j)。为为避避免免误误解解,最最好好采采用用大大家家都都能能理理解解的的写写法,比如通过增加括号明确组合关系,改善可读性。法,比如通过增加括号明确组合关系,改善可读性。(3)C语语言言中中类类似似的的问问题题还还有有函函数数调调用用时时,实实参参的的求求值值顺顺序序,C标准也无统一规定。标准也无统一规定。如:如:i=3,printf
58、(“%d,%d”,i,i+);有些系统执行的结果为有些系统执行的结果为3,3;有些系统为;有些系统为4,3。总之,不要写别人看不懂(难看懂)、也不知道系统会怎样执行的总之,不要写别人看不懂(难看懂)、也不知道系统会怎样执行的程序。程序。2.9赋值运算符和赋值表达式赋值运算符和赋值表达式1、赋值运算符、类型转换、赋值运算符、类型转换赋值运算符:赋值符号赋值运算符:赋值符号“=”就是赋值运算符。就是赋值运算符。 例如:例如:x=10+y; x=10+y; 执行赋值运算(操作),将执行赋值运算(操作),将10+10+y y的值赋给变量的值赋给变量x,x,同时整个表达式的值就是刚才所赋的值同时整个表达
59、式的值就是刚才所赋的值。说明:说明:(1)赋赋值值运运算算符符左左边边必必须须是是变变量量,右右边边可可以以是是常常量量、变变量量、函函数调用或常量、变量、函数调用组成的表达式。数调用或常量、变量、函数调用组成的表达式。例如:例如:x=10y=x+10y=func()都是合法的赋值表达式。都是合法的赋值表达式。(2)赋值符号赋值符号“=”不同于数学的等号,它没有相等的含义。不同于数学的等号,它没有相等的含义。(“=”相等)相等)例例如如:C语语言言中中x=x+1是是合合法法的的(数数学学上上不不合合法法),它它的的含含义义是是取出变量取出变量x的值加的值加1,再存放,再存放到变量到变量x中。中
60、。2.9赋值运算符和赋值表达式赋值运算符和赋值表达式(3)赋赋值值运运算算时时,当当赋赋值值运运算算符符两两边边数数据据类类型型不不同同时时,将将由由系系统统自动进行类型转换。自动进行类型转换。转转换换原原则则是是:先先将将赋赋值值号号右右边边表表达达式式类类型型转转换换为为左左边边变变量量的的类类型,然后赋值。型,然后赋值。将将实实型型数数据据(单单、双双精精度度)赋赋给给整整型型变变量量,舍舍弃弃实实数数的的小小数数部分。部分。将将整整型型数数据据赋赋给给单单、双双精精度度实实型型变变量量,数数值值不不变变,但但以以浮浮点点数数形式存储到变量中。形式存储到变量中。将将double型型数数据
61、据赋赋给给float型型变变量量时时,截截取取其其前前面面7位位有有效效数数字字,存存放放到到float变变量量的的存存储储单单元元中中(32bits)。但但应应注注意意数数值值范范围围不不能能溢溢出出。将将float型型数数据据赋赋给给double型型变变量量时时,数数值值不不变变,有有效效位位数数扩扩展展到到16位位(64bits)。字字符符型型数数据据赋赋给给整整型型变变量量时时,由由于于字字符符只只占占一一个个字字节节,而而整整型型变量为变量为2个字节,因此将字符数据(个字节,因此将字符数据(8bits)放到整型变量低放到整型变量低8位中。位中。类类型型转转换换等等等等见见课课本本P5
62、9P61,不不要要死死记记硬硬背背,上上机机实实践践和和自自学掌握。学掌握。2.9赋值运算符和赋值表达式赋值运算符和赋值表达式(4)C C语语言言的的赋赋值值符符号号“=”“=”除除了了表表示示一一个个赋赋值值操操作作外外,还还是是一一个个运运算算符符,也也就就是是说说赋赋值值运运算算符符完完成成赋赋值值操操作作后后,整整个个赋赋值表达式还会产生一个所赋的值,这个值还可以利用值表达式还会产生一个所赋的值,这个值还可以利用。例例如如:分分析析x=y=z=3+5这这个个表表达达式式。根根据据优优先先级级:原原式式x=y=z=(3+5); 根根 据据 结结 合合 性性 (从从 右右 向向 左左 ):
63、x=(y=(z=(3+5)x=(y=(z=3+5) 运算步骤运算步骤:序号表达式变量及值表 达 式的值z=3+5z(8)82y(8)83x=(y=(z=3+5)x(8)8z=(z=3+5) 12.9赋值运算符和赋值表达式赋值运算符和赋值表达式2、复合赋值运算符、复合赋值运算符在在赋赋值值符符“=”之之前前加加上上某某些些运运算算符符,可可以以构构成成复复合合赋赋值值运运算算符符,复复合合赋赋值值运运算算符符可可以以构构成成赋赋值值表表达达式式。C语语言言中中许许多多双双目目运运算算符符可可以与赋值运算符一起构成复合运算符,即:以与赋值运算符一起构成复合运算符,即:+=,-=,*=,/=,%=,
64、=,&=,|=,=例如:例如:n+=1等价于等价于n=n+1x*=y+1等价于等价于x=x*(y+1)注意:赋值运算符、复合赋值运算符的优先级比算术运算符低注意:赋值运算符、复合赋值运算符的优先级比算术运算符低。2.9赋值运算符和赋值表达式赋值运算符和赋值表达式3、赋值运算符、赋值表达式举例、赋值运算符、赋值表达式举例(1)a=5(2)a=b=5(3)a=(b=4)+(c=3)(4)假如假如a=3,分析:分析:a+=a-=a*aa+=a-=a*aa+=a-=(a*a)a+=(a-=(a*a)a+=(a=a-(a*a)a+=(a=a-a*a)a=a+(a=a-a*a)-122.10逗号运算符和逗
65、号表达式逗号运算符和逗号表达式4、逗号运算符、逗号运算符例:例:a=3*5,a*4 逗号运算符是所有运算符中优先级最低的。逗号运算符是所有运算符中优先级最低的。所所以以上上面面的的表表达达式式等等价价于于:(a=3*5),(a*4).所所以以整整个个表表达达式式计计算算后值为:后值为:60(其中其中a=15)逗逗号号表表达达式式的的求求解解过过程程是是:自自左左向向右右,求求解解表表达达式式1,求求解解表表达达式式2,求解表达式求解表达式n。整个逗号表达式的值是表达式整个逗号表达式的值是表达式n的值。的值。2.10逗号运算符和逗号表达式逗号运算符和逗号表达式#includemain()intx
66、,a;x=(a=3,6*3);/*a=3x=18*/printf(%d,%dn,a,x);x=a=3,6*a;/*a=3x=3*/printf(%d,%dn,a,x);3,183,3例题例题2.10逗号运算符和逗号表达式逗号运算符和逗号表达式例:例:14.设有定义设有定义:intx=2;,一下表达式中一下表达式中,值不为值不为6的是的是(200903)A)x*=x+1B)x+,2*xC)x*=(1+x)D)2*x,x+=2作业作业 1 1、设有定义:设有定义:floata=2,b=4,h=3;,floata=2,b=4,h=3;,以下以下C C语言表达式与代数语言表达式与代数式计算结果不相符的
67、是式计算结果不相符的是 A)(a+b)*h/2 A)(a+b)*h/2 B)B)(1/2)*(a+b)*h(1/2)*(a+b)*h C)(a+b)*h*1/2D)h/2*(a+b) C)(a+b)*h*1/2D)h/2*(a+b) 2 2、若以下选项中的变量已正确定义,则正确的赋值语句是()若以下选项中的变量已正确定义,则正确的赋值语句是() A)x1=26.8%3 B)1+2=x2 A)x1=26.8%3 B)1+2=x2 C)C)x3=0x12 D)x4=1+2=3;x3=0x12 D)x4=1+2=3; 3 3、有以下程序有以下程序main() int a; char c=10; fl
68、oat f=100.0; double x; a=f/=c*=(x=6.5); printf(“%d %d %3.1f %3.1fn”,a,c,f,x); 程序运行后的输出结果是程序运行后的输出结果是 A)1 65 1 6.5 B)1 65 1.5 6.5 C)1 65 1.0 6.5 D)2 65 1.5 6.5作业作业 4、设有以下定义设有以下定义:inta=0;doubleb=1.25;charc=A;#defined2则下面语句中错误的是()则下面语句中错误的是()A)a+;B)b+C)c+;D)d+;5 5、已知字符、已知字符A A的的ACSIIACSII码值为码值为6565,以下语句的输出结果是,以下语句的输出结果是charcharchch=B;=B;printfprintf(%c%dn,(%c%dn,chch, ,chch) )6 6、已定义、已定义c c为字符型变量,则下列语句中正确的是为字符型变量,则下列语句中正确的是A A)c=97; Bc=97; B)c=97; c=97; C C)c=97; Dc=97; D)c=a;c=a;