C语言基本数据描述.ppt
第二章第二章C语言基本数据描述语言基本数据描述2.1基本数基本数据类型据类型2.2变量和常量变量和常量2.3运算符和表达式运算符和表达式2.1.1字符集和标识符字符集和标识符l字符集字符集字符集是高级语言的编译系统所能识别的字母、字符集是高级语言的编译系统所能识别的字母、数字、和特殊符号。每种高级语言都有自己特定的字数字、和特殊符号。每种高级语言都有自己特定的字符集合。符集合。l标识符标识符 标识符是用来标识在标识符是用来标识在C程序中的变量、常量(指符程序中的变量、常量(指符号常量)、数据类型和函数的。通俗一点说,标识符号常量)、数据类型和函数的。通俗一点说,标识符是程序员为变量、常量或者函数起的名字,它实际上是程序员为变量、常量或者函数起的名字,它实际上是一个字符序列。是一个字符序列。(1)大大、小小写写英英文文字字母母:A,B,Z,a,b,z(2)数字:数字:0,1,2,9(3)运算符:运算符:+*/%=&|?!(4)括号:括号:()(5)标点符号:标点符号::;(6)特殊符号:特殊符号:_$#(7)空白符:空格符、换行符、制表符。空白符:空格符、换行符、制表符。C语言的字符集合包括:语言的字符集合包括:(1)字母或下划线中的任一字符打头。字母或下划线中的任一字符打头。(2)在第一个字符后,可以是任意的数字、字在第一个字符后,可以是任意的数字、字母、下划线组成的序列。长度不超过母、下划线组成的序列。长度不超过8个。个。关键字(保留字)关键字(保留字)标识符的分类:标识符的分类:特定字特定字用户定义字用户定义字任何一个标识符必须符合下列语法规则:任何一个标识符必须符合下列语法规则:关键字:又称保留字,一般为小写字母。关键字:又称保留字,一般为小写字母。关关键键字字是是C编编译译程程序序预预先先登登录录的的标标识识符符,它它们们代代表固定的意义,用户不能随便使用。表固定的意义,用户不能随便使用。若若随随便便使使用用,可可能能出出现现意意想想不不到到的的错错误误,编编译译能能通通过过,但但运运行行结结果果不不对对,且且不不容容易易检检查错误之所在。查错误之所在。关键字(保留字)关键字(保留字)特定字特定字特特定定字字:具具有有特特殊殊含含义义的的标标识识符符。它它们们虽虽然然不不是是关关键键字字,但但是是在在习习惯惯上上把把它它们们看看成成关关键键字字。所所以以一一般般用用户户定定义义的的标标识识符符也也不不要要使使用用它它们。们。特定字包括:特定字包括:defineundefincludeifdefifndefendifline 用用户户按按照照语语法法规规则则定定义义的的标标识识符符。用用户户定定义义字字可可以以用用来来标标识识用用户户自自己己使使用用的的变变量量,符符号号常常量量、数数据据类型以及函数等。类型以及函数等。注意注意(1)不能使用关键字和特定字。不能使用关键字和特定字。(2)用用户户定定义义字字为为了了标标识识不不同同的的对对象象,标标识识符符的的前前8个个(甚至(甚至7个)字符要有区别。个)字符要有区别。(3)标识符最好有含义。标识符最好有含义。(4)避免使用容易混淆的字符。如避免使用容易混淆的字符。如l与与1,0与与o,z与与2等。等。(5)大、小写代表不同的意义。大、小写代表不同的意义。(6)尽量不要与某个库函数同名。尽量不要与某个库函数同名。用户定义字用户定义字2.1.2变量与常量变量与常量l变量变量 变量是由程序命名的一块计算机内存区域,是变量是由程序命名的一块计算机内存区域,是用来存储一个可以变化的数值。用来存储一个可以变化的数值。l常量常量 与变量一样,常量也是存储在内存中的,但是,与变量一样,常量也是存储在内存中的,但是,常量的数值在程序执行过程中不会发生改变。常量的数值在程序执行过程中不会发生改变。无名常量(或称文字常量)无名常量(或称文字常量)符号常量(用预处理命令符号常量(用预处理命令#define#define为常量命名)为常量命名)在在使使用用一一个个变变量量之之前前,程程序序员员必必须须为为每每个个变变量量起起个个名名字字,同同时时还还要要声声明明它它的的数数据据类类型型,以以便便编编译译系系统统根根据据不不同同的的数数据据类类型型为为其其静静态态地地分分配内存空间。我们称之为定义变量。配内存空间。我们称之为定义变量。定义变量的格式为:定义变量的格式为:类型说明符类型说明符变量名表变量名表;不定值不定值定义变量定义变量2.2.1C C语言的数据类型语言的数据类型 整型整型int基本数据类型基本数据类型浮点型浮点型floatdouble字符型字符型char数组数组以以为标志为标志结构结构struct构造类型构造类型复杂数据类型复杂数据类型联合联合union枚举枚举enum指针类型指针类型以以*为标志为标志 C C语语言言的的数数据据类类型型整型整型 短整型短整型 short int short int 长整型长整型 long int long int 普通整型普通整型 int int 浮点型浮点型 普通浮点型普通浮点型 float float 双精度浮点型双精度浮点型 double double 字符型字符型 char char 不同数据类型的数据由于其在内存的存储方式不不同数据类型的数据由于其在内存的存储方式不同,存储所占的二进制位(同,存储所占的二进制位(bitbit)大多不相同。即使是)大多不相同。即使是相同类型的数据在不同种类的计算机所占位(相同类型的数据在不同种类的计算机所占位(bitbit)数)数也不完全相同。也不完全相同。2.2.2整型数据整型数据l整型变量整型变量 l整型常量整型常量 l用用printf显示整型数据显示整型数据 l用用scanf输入整型数输入整型数 按照整型变量所占的二进制位数来分类:按照整型变量所占的二进制位数来分类:short(短整型)(短整型)int(普通整型)(普通整型)long(长整型)(长整型)根据整型变量是否带符号位来分类:根据整型变量是否带符号位来分类:不带符号的整型变量不带符号的整型变量带符号的整型变量带符号的整型变量无符号用关键字无符号用关键字unsigned表示表示说明整型变量的语法是:说明整型变量的语法是:限定词限定词int变量名表;变量名表;在在IBMPC机机上上,普普通通整整型型占占16位位(bit),短短整整型型也也占占16位位(bit),而而长长整整型型占占32位位(bit)。根根据据整整型型数数据据所所占占的的位位数数,计计算算一一个个整整型型数数据据能能表表示示的的数数据据的的取值范围。取值范围。第第位位是是符符号号位位,如如果果符符号号位位为为0,表表示示是是正正整整数数,从到从到15位全为位全为1时表示的数最大。时表示的数最大。01111121515个个1则则16bit能表示的最大整数是能表示的最大整数是2151,即,即32767。如如果果符符号号位位为为1,表表示示是是负负整整数数,从从到到15位位都都为为0时表示的数最小。时表示的数最小。100015个个0在计算机中,这个数是在计算机中,这个数是-215的补码表示。因此,最的补码表示。因此,最小整数是小整数是-215,即,即-32768。整型常量表示:整型常量表示:十进制表示十进制表示八进制表示八进制表示以数字以数字 0开头开头十六进制表示十六进制表示以数字以数字0和和x开头。开头。inta,b,c;a=10;b=010;c=0 x10;长整型:要在数字后加上字母长整型:要在数字后加上字母L。longs;s=10L;需需要要注注意意的的是是:如如果果整整型型常常量量超超过过机机器器所所能能表表示示的的范范围围,则则会会发发生生溢溢出出,而而在在C语语言言中中的的整整数数溢溢出出并并不不会会使使程程序序出出错错,而而是是得得到到一一个个非非正确的值。正确的值。inta,b;a=10000;b=10000000;变量变量b的值会被系统认为是的值会被系统认为是-27008。%d表示把数据按十进制整型输出;表示把数据按十进制整型输出;%o表示把数据按八进制整型输出;表示把数据按八进制整型输出;%x表示把数据按十六进制整型输出;表示把数据按十六进制整型输出;%u表示把数据参数按无符号整型输出。表示把数据参数按无符号整型输出。注意:注意:除了除了%d,其余的格式都将数据作为无符号数输出。,其余的格式都将数据作为无符号数输出。printf(%ld,100000L);printf(%ld,100000L);正确正确printf(%d,100000L);printf(%d,100000L);结果结果-31072用用printf显示整型数据显示整型数据例例2.1#includestdio.hvoidmain()intx,y,z;x=129,y=0127,z=0 x128;printf(%d,%d,%dn,x,y,z);printf(%o,%o,%on,x,y,z);printf(%x,%x,%xn,x,y,z);运行结果:运行结果:129,87,296201,127,45081,57,128例例2.2#includestdio.hvoidmain()intx,y,z;x=-129,y=-0127,z=-0 x128;printf(%d,%d,%dn,x,y,z);printf(%o,%o,%on,x,y,z);printf(%x,%x,%xn,x,y,z);运行结果:运行结果:-129,-87,-296177577,177651,177330ff7f,ffa9,fed8说说明明:-0127和和-0 x128并并不不是是八八进进制制和和十十六六进进制制常常量量,“-”实实际际是运算符是运算符;使用使用%o和和%x显示的常量和变量是无符号数。显示的常量和变量是无符号数。使用域宽和对齐方式来控制显示格式使用域宽和对齐方式来控制显示格式在在%和和转转换换说说明明符符之之前前加加整整数数数数字字,表表示示数数据据显显示示的域宽的域宽;在在%后后面面加加符符号号“-”,数数据据显显示示时时左左对对齐齐,没没有有符符号号“-”,数据显示时右对齐。,数据显示时右对齐。printf(%-6x%-6x%-6xn,x,y,z);例例2.3#includestdio.hvoidmain()intx,y,z;x=129,y=0127,z=0 x128;printf(%6d%6d%6dn,x,y,z);printf(%6o%6o%6on,x,y,z);printf(%-6x%-6x%-6xn,x,y,z);运行结果:运行结果:129872962011274508157128scanf是是格格式式输输入入函函数数,其其功功能能是是按按指指定定的的格格式式将将标标准输入设备(例如键盘)输入的内容送入变量中。准输入设备(例如键盘)输入的内容送入变量中。scanf函数的使用格式:函数的使用格式:scanf(格式信息格式信息,输入项输入项1,输入项,输入项2,);其其中中,“格格式式信信息息”与与printf的的用用法法相相似似,可可以以在在其其中中使使用用%和和转转换换字字符符来来指指定定数数据据的的输输入入方方式式。需需要要注注意意的的是是,输输入入项项必必须须使使用用地地址址,普普通通变变量量的的地地址址是是在在变量名前加取地址符变量名前加取地址符&。用用scanf输入整型数输入整型数输入整型数据的转换字符有输入整型数据的转换字符有d,o,x,u%d表示把数据按十进制整型输入;表示把数据按十进制整型输入;%o表示把数据按八进制整型输入;表示把数据按八进制整型输入;%x表示把数据按十六进制整型输入;表示把数据按十六进制整型输入;%u表示把数据参数按无符号整型输入。表示把数据参数按无符号整型输入。与与printf函函数数类类似似,如如果果希希望望输输入入的的数数据据是是长长整整型型,需要在转换字符前加需要在转换字符前加l。例例2.4#includestdio.hvoidmain()intx,y,z1;longz2;scanf(%d%o%x%ld,&x,&y,&z1,&z2);printf(n%d,%d,%d,%ld,x,y,z1,z2);若输入为:若输入为:101010100000(回车符)(回车符)显示结果为显示结果为10,8,16,100000注意注意(1)scanf读读入入一一组组整整数数时时,scanf扫扫视视输输入入信信息息,跳跳过过空空格格、tab或或换换行行,寻寻找找下下一一个个输输入入域域。一一个个输输入入域域就就是是一个连续的非空白字符的数字串。一个连续的非空白字符的数字串。例如,若输入为:例如,若输入为:78231920(回车符)(回车符)38则输入域有四个。则输入域有四个。(2)格格式式信信息息中中除除了了有有%开开始始的的转转换换说说明明,还还可可以以有有普普通通字字符符,只只是是这这些些字字符符不不是是显显示示在在屏屏幕幕上上的的,而而是是要要求求使使用用者者在在输输入入数数据据时时,要要在在相相应应位位置置输输入入相相同同的的字字符符(除了空格、(除了空格、tab或换行符)。或换行符)。例例2.5#includestdio.hvoidmain()intx,y,z1,z2;scanf(x=%dy=%oz1=%xz2=%u,&x,&y,&z1,&z2);printf(n%d,%d,%d,%d,x,y,z1,z2);如果输入为:如果输入为:10101010(回车符)(回车符)则显示结果为是则显示结果为是0,484,2971,0正确的输入?正确的输入?2.2.3浮点数浮点数l浮点变量浮点变量 l浮点常量浮点常量 l用用printf显示浮点数据显示浮点数据 l用用scanf输入浮点数输入浮点数 浮点变量浮点变量单精度浮点数(单精度浮点数(floatfloat)双精度浮点数(双精度浮点数(doubledouble)long double long double 定义定义浮点变量:浮点变量:float a,b;float a,b;double c,d;double c,d;单单精精度度浮浮点点数数和和双双精精度度浮浮点点数数两两者者在在计计算算机机上上的的表表示示方方式式是是完完全全相相似似的的,只只是是所所占占的的二二进进制制位位数数不不同同,单单精精度度浮浮点点数数的的有有效效数数字字(或或称称精精度度)和和取取值值范范围围与与双精度浮点数不同。双精度浮点数不同。浮浮点点数数在在机机器器中中的的表表示示一一般般分分为为三三部部分分:符符号号位位、阶码、尾数。阶码、尾数。3232位位浮浮点点数数的的有有效效数数字字的的个个数数是是7 7位位十十进进制制数数字字,取取值值范范围围为为1010-38-38 10103838,6464位位浮浮点点数数的的有有效效数数字字的的个个数数是是1515位位十十进进制制数数字字,取取值值范范围围为为1010-308-308 1010308308。不不同同的的机器可能会有一些微小的差别。机器可能会有一些微小的差别。浮点常量浮点常量小数表示法小数表示法127.3科学计数法科学计数法1.273102在在C语言中,实际上也是用这两种方式,只不过语言中,实际上也是用这两种方式,只不过102用用E+2表示。表示。C程序中的浮点常数由整数部分、小数部分、指数程序中的浮点常数由整数部分、小数部分、指数部分构成。部分构成。浮点常量构成规则是:浮点常量构成规则是:(1)整整数数部部分分可可以以不不写写,小小数数部部分分也也可可以以不不写写,但但不不能能同同时不写。时不写。(2)指数部分可以省略(相当于使用小数表示法)指数部分可以省略(相当于使用小数表示法)(3)若有指数部分,若有指数部分,e(或(或E)两边都至少有一位数。)两边都至少有一位数。(4)指指数数的的数数字字必必须须是是整整数数(范范围围为为1到到3位位的的整整数数),可可以为负或正,正号可以省略。以为负或正,正号可以省略。例如,例如,4.50E3、1.0、1.、.1234、123.4都都是是合合法法的的浮浮点常量。点常量。注意:注意:浮浮点点常常量量在在存存储储时时按按double类类型型存存储储,即即占占32位(位(bit)。)。浮浮点点常常量量也也象象整整型型常常量量一一样样,如如果果浮浮点点常常量超过机器所能表示的范围,则会发生溢出。量超过机器所能表示的范围,则会发生溢出。浮浮点点溢溢出出也也不不会会使使程程序序出出错错,而而是是得得到到一一个非正确的值个非正确的值。%f显示小数表示的普通浮点数显示小数表示的普通浮点数%e显示科学记数法表示的浮点数显示科学记数法表示的浮点数输出双精度(输出双精度(double)类型时,还需要在转换字符)类型时,还需要在转换字符前加上字母前加上字母l。输出浮点数时控制输出域宽和有效位:输出浮点数时控制输出域宽和有效位:在在%与与f(或或e)之之间间加加上上两两个个数数字字并并在在两两个个数数字字之之间间加一个句点加一个句点“.”。例如,例如,%10.3f表示输出格式是域宽表示输出格式是域宽10,有效位,有效位3。注意注意:域宽的含义、缺省有效位、与数据本身的域宽的关系域宽的含义、缺省有效位、与数据本身的域宽的关系用用printf显示浮点数据显示浮点数据例例2.6#includestdio.hvoidmain()floatx;doubley;x=12.3456789;y=987654.321098;printf(n%e,%le,x,y);printf(n%f,%lf,x,y);printf(n%.3f,%.3lf,x,y);printf(n%14.3f,%14.3lf,x,y);printf(n%-14.3f,%-14.3lf,x,y);printf(n%8.3f,%8.3lf,x,y);printf(n%14f,%14lf,x,y);例例2.7voidmain()doublex,y;scanf(%lf%le,&x,&y);printf(n%lf,%lf,x,y);printf(n%le,%le,x,y);若输入为若输入为123.567891.2345678e17则运行结果为:则运行结果为:1.234568e+3,1.234568e+17用用scanf输入浮点数输入浮点数2.2.4字符型数据字符型数据 l字符字符变量变量 l字符字符常量常量 l用用printf显示显示字符字符 l用用scanf输入输入字符字符l用用getchar输入字符和用输入字符和用putchar输出字符输出字符l字符串常量字符串常量 字符变量字符变量数据类型说明符数据类型说明符char例如,例如,charaloha,beta,c;一个字符变量能存储一个字节的信息,每一个字符变量能存储一个字节的信息,每个字符有固定的编码,最常用的就是个字符有固定的编码,最常用的就是ASCII编编码。码。标准标准ASCII编码是把每个字符和与编码是把每个字符和与0127的的数值联系起来,用数值联系起来,用7位二进制表示,再将最高位位二进制表示,再将最高位充充0,就是一个字节了。,就是一个字节了。例如,在例如,在ASCII编码表中,编码表中,A用数值用数值65表示,表示,其其8位二进制表示是:位二进制表示是:01000001 字符常量字符常量 C C语言中的字符常量是用单引号将一个字符括起语言中的字符常量是用单引号将一个字符括起来。例如来。例如aa、bb。可以用字符常量为字符变量赋值:。可以用字符常量为字符变量赋值:char alpha=a;char alpha=a;char beta=b;char beta=b;注意:注意:(1)(1)引号中的字符只能是一个字符。引号中的字符只能是一个字符。(2)(2)不能用双引号括起一个字符表示单个字符常量。不能用双引号括起一个字符表示单个字符常量。(3)(3)非图形字符,如退格,换行等,也可以表示成字符非图形字符,如退格,换行等,也可以表示成字符型常量。表示方法是使用转义符型常量。表示方法是使用转义符 与一些特殊字符构成转与一些特殊字符构成转义义序序列列。例例如如nn就就是是一一个个转转义义序序列列,表表示示“回回车车换换行行”。(4)(4)字符型数据可以像整型数据一样参与四则运算。字符型数据可以像整型数据一样参与四则运算。b-a=198-97=1用用printf显示字符显示字符使用转换说明使用转换说明%c%c就可以输出单个字符了。就可以输出单个字符了。例例2.8#includestdio.hvoidmain()charc=H;chard=I;chare=!;printf(%c%c%cn,c,d,e);运行结果为:运行结果为:HI!用用scanf输入字符输入字符%c控制输入单个字符。控制输入单个字符。注意:注意:尽量不要将尽量不要将%c与其它转换说明一起使用。与其它转换说明一起使用。当当scanf读入一组数据时,如果不使用读入一组数据时,如果不使用%c做转换时,做转换时,scanf扫视输入信息,跳过空格、扫视输入信息,跳过空格、tab或换行,寻找下一或换行,寻找下一个输入域。个输入域。但是若使用但是若使用%c做转换时,情况则不同,做转换时,情况则不同,scanf不会不会跳过空格、跳过空格、tab或换行,而是直接把下一个字符输入给参或换行,而是直接把下一个字符输入给参数,不论它是什么。数,不论它是什么。例如,例如,scanf(%d%c,&i,&c);键盘输入键盘输入29wc的内容不是字符的内容不是字符w,而是空格。,而是空格。解决的方法是在控制字符串中加空格分隔。解决的方法是在控制字符串中加空格分隔。scanf(%d%c,&i,&c);用用getchar输入字符和用输入字符和用putchar输出字符输出字符getchar()函数的用法函数的用法 getchar()getchar()是接收一个从标准输入输出设是接收一个从标准输入输出设备上输入的字符。备上输入的字符。一般的标准输入设备是键盘。一般的标准输入设备是键盘。该函数没有参数,函数返回的数据类型为整型,该函数没有参数,函数返回的数据类型为整型,值为字符的值为字符的ASCIIASCII码值。码值。例例2.9#includestdio.hvoidmain()intc;c=getchar();printf(%c,c);putchar()函数的用法函数的用法putchar()是向标准输入输出设备上输出一个字符,是向标准输入输出设备上输出一个字符,一般的标准输出设备是屏幕终端。一般的标准输出设备是屏幕终端。putchar()与与getchar()不不同同,输输出出字字符符做做为为函函数数的的参参数,放在括号里。所以括号里的内容是不能缺省的。数,放在括号里。所以括号里的内容是不能缺省的。putchar()函数返回的数据类型为整型,值为字符的函数返回的数据类型为整型,值为字符的ASCII码值。码值。若想输出字符若想输出字符a,可以用几种方式?,可以用几种方式?intc;c=a;putchar(c);以及以及putchar(a);和和putchar(97);对于不可打印的字符,输出方式有两种:对于不可打印的字符,输出方式有两种:putchar(007);和和putchar(007);例例2.10输入一个字符,按字符原封不动输出。输入一个字符,按字符原封不动输出。#includestdio.hvoidmain()intc,i;c=getchar();i=putchar(c);或者或者#includestdio.hvoidmain()putchar(getchar()*/什么叫什么叫“系统的仿效返回系统的仿效返回”?字符串常量字符串常量用双引号括起来的字符序列是字符串常量。用双引号括起来的字符序列是字符串常量。howareyou1234.5字符串的存储与字符不同。字符串的存储与字符不同。C编译程序在存储字符编译程序在存储字符串常量时自动采用串常量时自动采用0作为字符串结束标志。作为字符串结束标志。how实际上所占的字节数是实际上所占的字节数是4。“a”与与a是是完完全全不不同同的的,前前者者是是字字符符串串常常量量,占占的的字节数是字节数是2,后者是字符常量,占的字节数是,后者是字符常量,占的字节数是1。字符串常量的输出字符串常量的输出printf(howareyou);printf(%s,howareyou);2.3.1 2.3.1 表达式表达式l表达式的概念表达式的概念 表达式是用运算符与圆括号将操作数连接起来所表达式是用运算符与圆括号将操作数连接起来所构成的式子。构成的式子。C语言的操作数包括常量、变量、函数值语言的操作数包括常量、变量、函数值等。等。根据表达式进行运算,得到的数值即为表达式的解。根据表达式进行运算,得到的数值即为表达式的解。l表达式与简单语句表达式与简单语句 在在C语言中,在一个表达式的后面加上分号语言中,在一个表达式的后面加上分号“;”就构成了简单语句。就构成了简单语句。有意义的简单语句有意义的简单语句无无意义的简单语句意义的简单语句2.3.2算术运算符算术运算符l种类及运算种类及运算+-*/%注意注意:v两个整数相除,结果仍为整数,商向下取整。两个整数相除,结果仍为整数,商向下取整。v 取取模模运运算算符符%实实际际上上是是数数学学运运算算的的求求余余数数运运算算,其两个操作对象都必须是整数其两个操作对象都必须是整数。v 减法运算符还可以用做单目运算符,是取负减法运算符还可以用做单目运算符,是取负v运算。其余操作符均为双目运算符。运算。其余操作符均为双目运算符。l算术表达式及算术运算符的优先级算术表达式及算术运算符的优先级算术表达式就是用算术运算符和圆括号将算术表达式就是用算术运算符和圆括号将操作数连接起来的式子。算术表达式的解就是操作数连接起来的式子。算术表达式的解就是经过算术运算得到的表达式的值。经过算术运算得到的表达式的值。算术运算符的优先级与数学基本相同,即算术运算符的优先级与数学基本相同,即先乘除,后加减。取模运算的优先级与乘除相先乘除,后加减。取模运算的优先级与乘除相同。函数和圆括号的优先级最高。同。函数和圆括号的优先级最高。注意:注意:v 算术表达式应能正确的表达数学公式。算术表达式应能正确的表达数学公式。例如:数学表达式是例如:数学表达式是 3+x 3+x 2a 2a 相应的相应的C C语言表达式应该是什么呢?语言表达式应该是什么呢?v算术表达式的结果应该不超过其所能表示的算术表达式的结果应该不超过其所能表示的数的范围。例如,最大的整型数是数的范围。例如,最大的整型数是3276732767,那么,那么,32767+332767+3就不会是正确的结果。而就不会是正确的结果。而32767L+332767L+3的结果是正确的,因为的结果是正确的,因为32767L32767L是长是长整型数。整型数。l算术运算符的结合性算术运算符的结合性运运算算符符的的结结合合性性是是指指如如果果一一个个操操作作数数左左边边和和右右边边的的两两个个运运算算符符的的优优先先级级相相同同,应应该该优优先先计计算算的的操作符。操作符。例如:例如:a+b-c操作数操作数b左右的运算符左右的运算符+和和-的优先级相同,的优先级相同,那么,是先计算那么,是先计算b-c,还是先计算,还是先计算a+b呢?呢?C语言语言规定双目算术运算符的结合性是自左至右,也就规定双目算术运算符的结合性是自左至右,也就是是b先与左边先与左边a结合,再与右边结合,再与右边c结合。所以是先结合。所以是先计算计算a+b,然后用,然后用a+b的结果减的结果减c。双目运算符的结合性与数学运算并无不同。双目运算符的结合性与数学运算并无不同。2.3.3 2.3.3 赋值运算符赋值运算符 l普通赋值运算符普通赋值运算符赋值表达式的一般形式是:赋值表达式的一般形式是:变量名变量名=表达式表达式赋值语句的一般形式是:赋值语句的一般形式是:变量名变量名=表达式;表达式;赋值运算符的优先级小于算术运算符。赋值运算符的优先级小于算术运算符。赋值运算符的结合性是自右至左,赋值运算符的结合性是自右至左,以以a=b=2为例为例 l复合赋值运算符复合赋值运算符 把赋值运算符与算术、位逻辑、移位运算把赋值运算符与算术、位逻辑、移位运算符放在一起,就构成复合赋值运算符。符放在一起,就构成复合赋值运算符。复复合合算算术术赋赋值值运运算算符符有有5个个+=、-=、*=、/=、%=。还还有有与与移移位位和和位位逻逻辑辑结结合合的的复复合合赋赋值值运运算算符符5个(个(=、&=、=、|=)。)。复合赋值运算符的使用规则是:复合赋值运算符的使用规则是:Xop=YXop=Y与与X=XopYX=XopY等价。等价。2.3.42.3.4不同数据类型数据间的混合运不同数据类型数据间的混合运算算l 自动转换自动转换l 强制转换强制转换l 赋值表达式的类型转换赋值表达式的类型转换 自动转换自动转换所谓所谓“自动转换自动转换”就是系统根据规则自动将就是系统根据规则自动将两个不同数据类型的运算对象转换成同一种数两个不同数据类型的运算对象转换成同一种数据类型的过程。而且,对某些数据类型,即使据类型的过程。而且,对某些数据类型,即使是两个运算对象的数据类型完全相同,也要做是两个运算对象的数据类型完全相同,也要做转换,例如转换,例如float。强制转换强制转换在在C语语言言中中,允允许许程程序序员员根根据据自自己己的的意意愿愿将将一种数据类型强制转换成另一种数据类型。一种数据类型强制转换成另一种数据类型。强制转换的格式为:强制转换的格式为:(数据类型名数据类型名)操作对象操作对象注意注意,强制转换并不改变操作对象的数据类型,强制转换并不改变操作对象的数据类型和数值。例如,和数值。例如,(int)f的确切含义是将的确切含义是将f转换成转换成为整型值参与运算,而为整型值参与运算,而f本身的数据类型和数本身的数据类型和数值都没有任何改变。值都没有任何改变。赋值表达式的类型转换赋值表达式的类型转换当赋值运算符左边的变量与赋值运算符右当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型相同时,不需要进行数边的表达式的数据类型相同时,不需要进行数据类型的转换。据类型的转换。当赋值运算符左边的变量与赋值运算符右当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型不相同时,系统负责将边的表达式的数据类型不相同时,系统负责将右边的数据类型转换成左边的数据类型。此时,右边的数据类型转换成左边的数据类型。此时,会有两种情况产生,一种是转换以后会丢失数会有两种情况产生,一种是转换以后会丢失数据,另一种是转换以后不会丢失数据。这与赋据,另一种是转换以后不会丢失数据。这与赋值号两边的表达式的数据类型所占的字节数及值号两边的表达式的数据类型所占的字节数及存储表示方式有关。存储表示方式有关。(详细内容自学)详细内容自学)例例3.1#includestdio.hvoidmain()intc;/*charc;*/c=B;printf(c=%c,c+a-A);运行结果:运行结果:c=b例例3.2#includestdio.hvoidmain()charc;inti=0 x3241;printf(i=%cn,i);c=i;printf(c=%dn,c);printf(i=%dn,i);运行结果运行结果i=Ac=65i=128652.3.5关系运算符关系运算符l所谓关系运算,实际上就是比较两个数值所谓关系运算,实际上就是比较两个数值的大小。那么,比较两个数值的大小的运算符的大小。那么,比较两个数值的大小的运算符就是关系运算符。就是关系运算符。关系运算符有六个关系运算符有六个、=、z;j=xyz;printf(%2d,%2d,i,j);printf(%2d,zy=3);printf(%2d,y+z=z+1);运行结果为:运行结果为:1,0,0,0,12.3.6逻辑运算符逻辑运算符如果将如果将“与、或、非与、或、非”运算应用于逻辑值运算应用于逻辑值(逻辑真和逻辑假)则称为逻辑运算。(逻辑真和逻辑假)则称为逻辑运算。C语言中的逻辑运算符有三个:语言中的逻辑运算符有三个:逻辑与逻辑与&、逻辑或、逻辑或|和逻辑非和逻辑非!其其中中逻逻辑辑与与和和逻逻辑辑或或是是双双目目运运算算符符,而而逻逻辑辑非是单目运算符。非是单目运算符。逻辑运算的规则与二进制的位逻辑是相逻辑运算的规则与二进制的位逻辑是相似的。似的。逻辑运算的规则下表:逻辑运算的规则下表:C语言系统对任何非语言系统对任何非0值都认定为是逻辑值都认定为是逻辑真,而将真,而将0认定为逻辑假。认定为逻辑假。如果一个表达式参与逻辑运算,只要这个如果一个表达式参与逻辑运算,只要这个表达式的解为非表达式的解为非0,则系统就认为这个表达式,则系统就认为这个表达式的结果是逻辑真。的结果是逻辑真。但是要注意,系统逻辑运算的结果仍然只但是要注意,系统逻辑运算的结果仍然只有两个:有两个:1(逻辑真)和(逻辑真)和0(逻辑假)。(逻辑假)。逻辑运算符经常与关系运算符一起使用。逻辑运算符经常与关系运算符一起使用。C C语语言言表表达达式式(x=10)&(x=10)&(x=100)的的数数学学含含义是:义是:1010 x x100100 逻辑运算符的优先级逻辑运算符的优先级 !&|高高低低 !的的优优先先级级高高于于算算术术运运算算符符(当当然然也也高高于于关系运算符)和赋值运算符关系运算符)和赋值运算符&和和|的优先级高于赋值运算符,但是低的优先级高于赋值运算符,但是低于算术运算符和关系运算符。于算术运算符和关系运算符。!单单目目运运算算符符,其其结结合合性性是是自自右右至至左左;&和和|的结合性是自左至右。的结合性是自左至右。计算表达式计算表达式79-!079-!0的值的值 注意注意:在在C C语言中,如果逻辑运算符的左操作数语言中,如果逻辑运算符的左操作数已经能够确定表达式的解,则系统不再计算右已经能够确定表达式的解,则系统不再计算右操作数的值。操作数的值。x=1&y=0 x=1&y=0若若x x此时不为此时不为1 1,在检测,在检测x=1x=1以后,就不以后,就不会再检测会再检测y=0y=0。因为。因为x=1x=1的结果是逻辑假,逻的结果是逻辑假,逻辑假与任何数进行逻辑与操作结果都会是逻辑辑假与任何数进行逻辑与操作结果都会是逻辑假。假。x=y|x=0若若x=y成立,则表达式的值为真,不需要继成立,则表达式的值为真,不需要继续做续做x=0了。但是,若了。但是,若x=y不成立,由于不成立,由于x=0是是个赋值表达式,表达式的结果很可能是错误的。个赋值表达式,表达式的结果很可能是错误的。假设该表达式计算以前,假设该表达式计算以前,x值为,值为,y的值为,的值为,x=y的计算结果是,这时需要执行赋值的计算结果是,这时需要执行赋值x=0,表达式的结果仍然是,而实际上这时的表达式的结果仍然是,而实际上这时的x和和y的值均为,又满足了的值均为,又满足了x=y,这不是产生了矛,这不是产生了矛盾吗?盾吗?不要在一般的表达式中夹杂赋值运算不要在一般的表达式中夹杂赋值运算 2.3.7增增1/减减1运算符运算符+和和-。这这两两个个运运算算符符都都是是单单目目运运算算符符,其其功功能能分分别别是将变量自身的内容增是将变量自身的内容增1和减和减1。+i和和-i是前缀表示法,是前缀表示法,i+和和i-是后缀表是后缀表示法。如果直接在示法。如果直接在+i和和i+的后面加上分号构的后面加上分号构成成C的执行语句,即的执行语句,即+i;和和i+;前缀与前缀与后缀并无区别(减符号也一样)。但是,将后缀并无区别(减符号也一样)。但是,将它们用在表达式中则前缀与后缀是有区别的。它们用在表达式中则前缀与后缀是有区别的。前缀表示法是先将前缀表示法是先将i值增值增/减减1,再在表达,再在表达式中使用;而后缀表示法是先在表达式中使式中使用;而后缀表示法是先在表达式中使用用i的值,再将的值,再将i值增值增/减减1。例如:例如:i=3;i=3;j=i+;j=+i;结果结果j的内容为的内容为3j的内容为