1、1第第2 2章章 基本数据类型、运算符和表达基本数据类型、运算符和表达式式本章要点本章要点l掌握c语言中的数据类型l掌握常用的表达式形式,以及运算符的优先级和结合性。X+y/3 X=Y=3成绩、工资、平均体重、价格类型?范围?精度?内存结构?运算?2第第2 2章章 基本数据类型、运算符和表达式基本数据类型、运算符和表达式l2.12.1变变量和常量量和常量 l2 22 2 基本基本数数据据类类型型l2 23 3 整型整型l2 24 4 实实型型 l2 25 5 字符型字符型 l2 26 6 运运算符和表算符和表达达式式 l2 27 7 基本的基本的输输入入输输出函出函数数l2 28 8总结与总结
2、与提高提高 32.1变量和常量变量l数学中的变量变量是指其值可以变化的量,程序中的变量是指可多次赋值的量。l变量有三个要素,变量类型、变量名和变量地址。例2-1 变量的使用main()int x,y,sum;printf(“nplease input two integers:);scanf(%d%d,&x,&y);/*输入两个整数*/sum=x+y;/*两个整数求和*/printf(nThe sum is%d,sum);/*将和输出*/42.1变量和常量变量l不同的数据类型,其占用的内存空间一般不一样,存储格式也可能不一样,表示范围和精度都有区别。l在Turbo c中,命名变量的规则如下:-
3、必须以字母或下划线开头,后面可以是字母、数字或下划线;-ANSI C标准没有规定变量名的长度(字符个数),但各个c编译系统都有自己的规定。为了程序具有较好的可移植性和阅读程序的方便,变量名一般不要超过16个字符;-变量名区分大小写,如变量名abc与变量名ABC是不同的变量;-变量名不能使用系统的关键字(或称保留字)52.1变量和常量变量lC语言中的关键字有(共32个):auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、
4、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while。62.1变量和常量变量l例如:下列是合法的变量名:l下列是不合法的变量名:SUM,_total,_ch1,employee_name,p_1M.D.John,$876,3D67,ab,int72.1变量和常量常量l相对变量的概念就是常量常量,也称为常数。在程序运行过程中,其值不能被改变的量称为常量。具体来说有两类:普通常量符号常量3,7.56,a,”I love beijing”,#difine PI 3.1482.1变量和常量
5、常量例2-2 符号常量的例子#define PI 3.14main()float r,area;printf(“nPlease input the radius:);scanf(%f,&r);/*输入某圆的半径*/*PI=3.1415926;此句错误,不能通过编译,因为PI是符号常量,不能重新赋值。*/area=PI*r*r;/*计算该圆的面积*/printf(nThe area of the circle is:%f,area);/*输出该圆的面积*/92.1变量和常量常量l问题:使用符号常量有什么好处?102 22 2 基本数据类型基本数据类型 lC语言数据类型数据类型构造类型基本类型指针
6、类型整型空类型浮点型结构体字符型枚举类型单精度型双精度型共用体数组类型图21 C语言数据类型112 23 3 整型整型整型常量整型常量 l在语言中,使用的整型常量有十进制、八进制和十六进制三种,用不同的前缀来标识不同进制的整型常量,用不同的后缀来标识不同类型的整型常量。l(1)十进制整常量:其各位数为09,但最高位不能为0(除了0这个数字外)。例如,22,0,-56等是合法的十进制整常数;而01、726C不是十进制整常数。l(2)八进制整常量:八进制整常量必须以数字0开头,即以0作为八进制数的前缀。各位数取值为07。122 23 3 整型整型整型常量整型常量l以下各数是合法的八进制数:-01(
7、十进制为1)、0101(十进制为65)、0177777(十进制为65535);l以下各数不是八进制数(Why):-25、07C2。(3)十六进制整常量:十六进制整常量的前缀为0X或0 x。十六进制需要十六个字符来表示各位可能出现的数符,这些字符规定为09,AF或af。132 23 3 整型整型整型常量整型常量l以下各数是合法的十六进制整常量:-0X4B(十进制为75)、0X10(十进制为16)、0XFFFF(十进制为65535);l以下各数不是十六进制整常量:-5A(无前缀0X)、0X5H(含有非十六进制数码)。142 23 3 整型整型整型常量整型常量l(4)整型常量的后缀:在16位字长的机
8、器上,基本整型的长度为16位,因此表示的数的范围也是有限定的。l注意:八进制整型常量和十六进制整型常量都只能表示正整数,因此16位取值范围是0+65535,而十进制整型常量可以是负数,取值范围为-32768+32767。如果使用的数超过了上述范围,则要用相应的后缀来标明。152 23 3 整型整型整型常量整型常量l超范围的数用长整型数来表示(关于整型数据类型,参考本章2.3.2节)。长整型数是用后缀“L”或“l”来表示的。例如:十进制长整型常数:例如32L(十进制为32)、1234567L(十进制为1234567);八进制长整型常数:例如040L(十进制为32)、0300000L(十进制为98
9、304);十六进制长整型常数:例如0X20L(十进制为32)、0XFFFFL(十进制为65535)。注意注意:整数32L和基本整常数32在数值上并无区别但是在内存中,32L占用4个字节空间,而32只占用2个字节的空间,因此是不相同的。162 23 3 整型整型整型常量整型常量l如果要表示一个无符号数,整型常数的后缀为“U”或“u”。例如:-358u,0 x38Au,235Lu均为无符号数。l前缀和后缀可同时使用以表示各种类型的数。如0XB7CLu表示十六进制无符号长整数B7C,其十进制数为2940。2 23 3 整型整型整型常量整型常量172 23 3 整型整型整型常量整型常量例2-3各进制整
10、数的输出。main()int i;i=167;printf(ni=167);printf(nThe decimal form is%d,i);/*以十进制格式显示*/printf(nthe octonary form is%o,i);/*以八进制格式显示*/printf(nthe hexadecimal form is%x,i);/*以十六进制格式显示*/i=0167;182 23 3 整型整型整型常量整型常量 printf(ni=0167);printf(nThe decimal form is%d,i);printf(nthe octonary form is%o,i);printf(nt
11、he hexadecimal form is%x,i);i=0 x167;printf(ni=0 x167);printf(nThe decimal form is%d,i);printf(nthe octonary form is%o,i);printf(nthe hexadecimal form is%x,i);192 23 3 整型整型整型常量整型常量l运行该程序后,其结果为:i=167The decimal form is 167The octonary form is 247The hexadecimal form is a7i=0167The decimal form is 119
12、The octonary form is 167The hexadecimal form is 77i=0 x167the decimal form is 359the octonary form is 547the hexadecimal form is 167202 23 3 整型整型整型变量整型变量l整型变量分类。l短整型基本整型长整型。在16位字长的机器中,基本整型变量占2个字节。有无符号位有符号整型无符号整型有无符号位短整型长整型基本整型2*3=6类212 23 3 整型整型整型变量整型变量l1整数的机内表示 如果声明一个整型变量:int i;i=876;因为876292826252
13、322,所以在机内二进制的表示形式如图2-2所示(共占16位):图22 876在内存中的表示0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0222 23 3 整型整型整型变量整型变量l无符号整型将所有的位均表示为数据,因此只有正数形式。有符号的整型将最高位用做符号位,最高位为“1”表示负数,为“0”表示正数。数据在内存中是以二进制形式存放的。实际上,数数据在内存中是以二进制形式存放的。实际上,数值是以补码表示的。值是以补码表示的。(1)(1)对于正数,原码对于正数,原码 =反码反码 =补码。补码。(2)(2)对于负数,补码对于负数,补码 =反码反码 +1+1。(3)(3)引入补码
14、后,使减法统一为加法。引入补码后,使减法统一为加法。补补补补)(251032510325103 计算正数的补码计算正数的补码原码原码=反码反码=补码补码int 10;原原 码:码:反反 码:码:补补 码:码:00 00 00 00 00 00 10 1000 00 00 00 00 00 10 1000 00 00 00 00 00 10 10 计算负数的补码计算负数的补码int型型 -10;绝对值:绝对值:1000 00 00 00 00 00 10 10二进制:二进制:11 11 11 11 11 11 01 01取取 反:反:11 11 11 11 11 11 01 10加加 1:反反
15、码码补补 码码绝对值绝对值 二进制二进制 取反取反 加加 1请请写出写出2020、-20-20的补码的补码int 20;原原 码:码:补补 码:码:00 00 00 00 00 01 01 0000 00 00 00 00 01 01 00int -20;绝对值:绝对值:20 二进制:二进制:取取 反:反:加加 1:00 00 00 00 00 01 01 0011 11 11 11 11 10 10 11 11 11 11 11 11 10 11 00 补补 码码272 23 3 整型整型整型变量整型变量l2整型变量的类型 数据类型类型说明符字节数表示范围无符号短整型unsigned sho
16、rt int2065535(0216-1)有符号短整型signed Short int2-3276832767(-215215-1)无符号整型unsigned int2065535有符号整型signed int2-3276832767无符号长整型unsigned long int404294967295有符号长整型signed long int4-21474836482147483647282 23 3 整型整型整型变量整型变量l3整型变量的声明和赋值 l声明变量的格式为:变量类型变量类型 变量名;变量名;l下面是声明整型变量的例子:short int x;声明了一个短整型的变量x。而 uns
17、igned int 则声明了一个无符号的基本整型变量。292 23 3 整型整型整型变量整型变量l声明变量的时候要注意三点:(1)允许一行声明多个同类型变量,各变量名间用“,”(逗号)隔开;(2)变量必须先声明,然后才能使用;(3)在一个语句块中,程序中所有的变量应当一 起声明在开始处,不能重复声明。302 23 3 整型整型整型变量整型变量例2-4整型变量的运用main()int a,b,c,d;/*在程序段开始处一起声明变量*/unsigned u;a=12;b=-24;u=10;/*用常量为变量赋值*/c=a+u;d=b+u;/*用一个表达式为变量赋值*/printf(na+u=%d,b
18、+u=%d,c,d);312 23 3 整型整型整型变量整型变量例2-5一个不正确的例子main()int x,y;y=x;printf(ny=%d,y);我错在那?呜呜呜322 23 3 整型整型整型变量整型变量l给整型变量赋值有很多方式(1)声明时立即赋值,称为初始化。例如:int x=3;int y=4,z=5;(2)先声明后赋值。int x;x=3;(3)通过格式化函数scanf从标准输入设备输入。int x;scanf(“%d”,&x);332 23 3 整型整型整型变量整型变量l4整型值的输出。也可以将整型常量或变量的值以十进制、八进制或十六进制的格式输出,例23说明了这一点。重要
19、提示:数学上的整数可以无限大,但程序设计中整数在机内存储所占的内存有限,因此整型数据表示的范围有限,在平时的编程中,要特别注意不能把一个超过范围的数值赋值给一个整型变量。如果这样做了,那么这个整型变量事实上接受的不是预想中的值,称为“溢出”。342 23 3 整型整型整型变量整型变量例2-6整型数据的溢出。main()int a,b;a=32767;b=a+1;printf(%d,%dn,a,b);运行后,其结果为:32767,-32768352 23 3 整型整型整型变量整型变量l为什么会出错?0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1a=32767:图25 整数溢出0
20、0 0 0 0 0 0 0 0 0 0 0 0 0 0 1+11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-32768362 24 4 实型实型实型常量实型常量 在C语言中,实数只采用十进制。基本的形式为:整数部分整数部分.小数部分小数部分但有两种表达方式:(1)小数方式:由09和小数点组成。例如:035,167,6736,728.3 等。(2)指数方式:由十进制实数,加阶码标志“e”或“E”以及阶码(只能为整常量,可以带符号)组成。其一般形式为:aEn或aen(a为十进制数,n为十进制整数表示的阶码)其值为a10n。372 24 4 实型实型实型常量实型常量l实型常量的例子
21、l使用实型常量要注意以下几点:(1)整数部分和小数部分可以省略其中的一个,例如,.36和200.都是合法的实型常量。(2)用指数方式时,E或e两边都要有数字,但都只能是常量。(3)实型分为单精度实型和双精度实型,但是实型常数不分单、双精度,都按双精度double型处理。036e2,表示0.36102;12.56E12,表示12.561012;3.89e3,表示3.89103。382 24 4 实型实型实型变量实型变量l1实型数据的机内表示 实型数据一般占4个字节(32位)内存空间,按指数形式存储。比如实数3.14159在内存中的存放形式:+.3141591数符小数部分阶符阶数 小数部分占的位数
22、愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。392 24 4 实型实型实型变量实型变量l2实型变量的类型类型类型说明符比特数(字节数)有效数字表示范围单精度实型float32(4)67-3.410-373.41038 双精度实型double64(8)1516-1.710-3071.710308 长双精度实型long double 128(16)1819-1.210-49311.2104932 402 24 4 实型实型实型变量实型变量l3实型变量的声明和赋值 实型变量定义的格式和书写规则与整型相同。例如:float x,y;(x,y为单精度实型量)doubl
23、e a,b,c;(a,b,c为双精度实型量)412 24 4 实型实型实型变量实型变量实型变量赋值方式与整型变量类似,但是要注意的是从键盘输入时scanf()函数的类型说明符为“%f”:float x;x=scanf(“%f”,&x);从键盘输入实数时可以用小数的形式或指数的形式输入。422 24 4 实型实型实型变量实型变量l4实型值的输出 若用printf()函数输出,格式输出符是“%f”,细节请参看本章2.7节。432 24 4 实型实型实型变量实型变量l5实型数据的舍入误差例2-7 实型数据的舍入误差。main()float a,b;a=123456.789e5;b=a+20;prin
24、tf(na=%f,b=%f,a,b);该程序的运行结果是:a=12345678848.000000,b=12345678848.000000442 25 5 字符型字符型字符常量字符常量 l字符常量是用单引号括起来的单个字符或转义字符。例如:a、c、=、+、?都是合法字符常量。注意,a和A是不同的字符常量。l在语言中,字符常量有以下特点:(1)字符常量只能用单引号括起来,不能用双引号或其它括号。(2)字符常量只能是单个字符,不能是字符串。(3)有些字符有特殊含义,如单引号“”、双引号“”等,还有一些字符不能或不方便直接从键盘输入,比如回车换行符、退格符等。这时可使用转义字符来表示。452 25
25、 5 字符型字符型字符常量字符常量转义字符转义字符的意义ASCII代码n回车换行(之后的内容到下一行)10t横向跳到下一制表位置9b退格(删除前一个字符)8r回车(回到本行开头)13f走纸换页12反斜线符92单引号符39”双引号符34a鸣铃7ddd13位八进制数所代表的字符xhh12位十六进制数所代表的字符462 25 5 字符型字符型字符常量字符常量 广义地讲,语言字符集中的任何一个字符均可用转义字符来表示。表中的ddd和xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码(ASCII表见附录1)。如101(十进制为65)表示字母A,012(十进制为10)代表换行,37
26、6代表图形字符“”,XOA表示换行等。特别注意0或000是代表ASCII码为0的控制字符,即“空操作”。要注意的是,015表示回车,不换行,使得输出的当前位置移到本行开头,而n表示回车换行,使得输出的当前位置跳到了下一行的行首。472 25 5 字符型字符型字符常量字符常量例2-8 转义字符的使用。main()printf(ab ct derf012);printf(hi 101x61);运行后其结果如下(表示空格,本章其它地方出现这个符号,不作特别说明的话也代表空格):fabcdehi”Aa482 25 5 字符型字符型字符变量字符变量l1字符数据的机内表示01111000 每个字符变量被分
27、配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中。如x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a,b赋予x和y值:a=x;b=y;实际上是在a,b两个单元内存放120和121的二进制代码,如图2-7所示:a:b:01111001字符字符ASCIIASCII码表码表 5 p$2 2 2+2=4 值符号值符号值符号0空字符44,9132空格45-9233!46.933447/9435#48 570 9 95-36$58:9637%59;97 122a z38&6012541)63?12642*64127DEL(Dele
28、te键)43+65 90A Z 502 25 5 字符型字符型字符变量字符变量例2-9 把整数赋给字符变量。main()char a,b;a=x;/*将字符常量赋值给字符变量*/b=120;/*将整型常量赋值给字符变量*/printf(%c,%dn,a,a);printf(%c,%dn,b,b);运行后其结果是:x,120 x,120512 25 5 字符型字符型字符变量字符变量例2-10大小写转换main()char a,b;a=a;b=B;printf(n%c,%dn%c,%d,a,a,b,b);a=a-32;b=b+32;printf(n%c,%dn%c,%d,a,a,b,b);522
29、25 5 字符型字符型字符变量字符变量运行后,其结果是:a,97B,66A,65b,98532 25 5 字符型字符型字符变量字符变量l2字符变量的声明和赋值字符变量的声明格式为:char char 变量名;变量名;例如:char x,y;该语句声明了两个字符变量x和y。字符变量声明后就可以赋值,对于声明的变量x可以这样赋值:x=x;注意,在该语句中,左边的x是变量,而右边的x是字符常量。542 25 5 字符型字符型字符变量字符变量 字符变量也可用转义字符赋值:x=b;该语句将退格符赋值给了x。也可以从标准输入设备输入字符给字符变量,如:scanf(“%c”,&x)。因为scanf函数可以指
30、定输入数据的类型,也称做格式化输入函数。552 25 5 字符型字符型字符串常量字符串常量l在C语言中,没有为字符串定义变量类型,也就是说,没有字符串变量这个概念。但是有字符串常量的概念。日常生活中的人名、书名等,都要用字符串来描述。字符串可以存储在后面将要学到的数组或指针类型变量中。l字符串常量是由一对双引号括起的字符序列。例如:“CHINA”,“C program”,“$12.5”等都是合法的字符串常量。l如果要将双引号“”作为字符串的一部分,那么就需要使用转义字符。例如:“the number”5”,该字符串就是平时理解的the number“5”。562 25 5 字符型字符型字符串常
31、量字符串常量l字符串常量和字符常量是不同的量。它们之间主要有以下区别:(1)从书写格式上看,字符常量由单引号括起来,字符串常量由双引号括起来。(2)从形式上看,字符常量只能是单个字符,字符串常量则可以含一个或多个字符。(3)从赋值方式上看,可以把一个字符常量赋值给一个字符变量,但不能把一个字符串常量赋值一个字符变量。在语言中没有相应的字符串变量,但是可以用一个字符数组或字符指针变量来存放一个字符串常量。在数组一章内予以介绍。572 25 5 字符型字符型字符串常量字符串常量(4)从内存格式上看,字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字
32、符“0”(ASCII码为0)。这是字符串结束的标志。例如:字符串“C program”在内存中所占的字节为如图2-8所示。CprOgram0582 25 5 字符型字符型字符串常量字符串常量l字符常量a和字符串常量“a”虽然都只有一个字符,但在内存中的情况是不同的。l思考:语句“printf(“I like 0 c”)”执行的结果是什么?l答案:I like 592 26 6 运算符和表达式运算符和表达式运算符简介运算符简介 l算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(+)、自减(-)、强制类型转换共八种。l关系运算符:用于比较运算
33、。包括大于()、小于(=)、小于等于(=)和不等于(!=)六种。l逻辑运算符:用于逻辑运算。包括与(&)、或(|)、非(!)三种。l位操作运算符:参与运算的量按二进制位逐位进行运算。包括按位与(&)、按位或(|)、按位非()、按位异或()、左移()六种。602 26 6 运算符和表达式运算符和表达式运算符简介运算符简介l赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,=,=,=)三类共十一种。l条件运算符:这是一个三目运算符,用于条件求值(?:)。l逗号运算符:用于把若干表达式组合成一个表达式(,)。l指针运算符:用于取内
34、容(*)和取地址(&)二种运算。l求字节数运算符:用于计算数据类型所占的字节数(sizeof)。l特殊运算符:有括号(),下标,成员(,.)等几种。612 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式 l1基本的算术运算符l加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算。如a+b,4+8等。l减法运算符“-”:减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算。l乘法运算符“*”:双目运算符。l除法运算符“/”:双目运算符。参与运算的量均为整型时,结果为舍去小数整型数;如果运算量中有一个是实型,则结果为双精度实型数。l求余
35、运算符(也称模运算符)“%”:双目运算符。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。622 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式例2-11两数相除。main()printf(n%d,%d,20/7,-20/7);printf(n%f,%f,20.0/7,-20.0/7);该程序的运行结果为:2,-22.857143,-2.857143“/”两个操作数如果都为整形,结果为整形,如果有一个为实型,结果即为实型。632 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式例2-12除法与求余。main()
36、printf(n%d,%d,100/3,100%3);该程序运行后的输出为:33,1 642 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式l2算术表达式和运算符的优先级和结合性l表达式表达式是由常量、变量、函数和运算符组合起来的式子。表达式有相应类型的值,它们等于计算表达式所得结果。表达式求值按运算符的优先级优先级和结合性结合性规定的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。652 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式l算术表达式算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符
37、合C语法规则的式子,例如(a+b)*3+c/2。例2-13表达式的值main()int a,b;a=5;b=7;printf(n(a*2)/b=%d,(a*2)/b);其运行结果为:(a*2)/b=1662 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式l(2 2)运算符的优先级和结合性)运算符的优先级和结合性 在表达式求值的时候,先按运算符的优先级别从高到低进行,若运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理(优先级相同的所有运算符结合方向相同,因此不会有矛盾)。算术运算符的优先级别从小到大是:先乘除(*、/和%的等级相同),后加
38、减(和的等级相同)。若有a+b/c,因为除运算比加运算优先级高,因此先算除法,再将其结果与a相加。672 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式 语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右。如有表达式a+b-c,则b应先与“+”号结合,执行a+b运算,然后再执行-c的运算。C语言中各种运算符及其优先级和结合性请参看附录3,理解运算符的优先级和结合性才能真正理解表达式的合法性和运算过程。682 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式l3强制类
39、型转换运算其一般形式为:(类型说明符类型说明符)()(表达式表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(float)a 把a转换为实型 (int)(x+y)把x+y的结果转换为整型 692 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式如果有下述语句:int i;float x=3.6;i=(int)x;/*不能省略括号*/则i的值为3。注意:x本身的值还是3.6。类型转换还有一种,就是自动转换,请看下面的语句:int i=3;float x;x=i;在这里,语句x=i不需要写成x=(float)i,其转换是自动完成的。702
40、 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式l4自增、自减运算符 自增1运算符记为“+”,其功能是使变量的值自增1。自减1运算符记为“-”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:712 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式(1)+i i自增1后再参与其它运算。例如,假设i和j为已经声明好的整型变量:j=+i相当于(注意两个语句的先后顺序,不能颠倒):i=i+1;j=i;(2)-i i自减1后再参与其它运算。例如:j=-i;相当于:i=i-1;j=i;722
41、 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式(3)i+i参与运算后,i的值再自增1。例如:j=i+;相当于:j=i;i=i+1;(4)i-i参与运算后,i的值再自减1。例如:j=i-;相当于:j=i;i=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=4,j=4/k=3,j=4/k=3,j=4/4/4/3/3/c=20,a=4/c=20,a=4/c=15,a=4/c=15,a=473
42、2 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式 自加自减运算用法灵活,出现在较复杂的表达式或语句中时,常常难以弄清,因此应仔细分析。例如,设i,j都为整型,j=i+合法,而j=(i+)+却不合法,因为(i+)是表达式,不能在用+运算了。另外,碰到繁难的表达式,必要的时候可以编写程序运行,通过结果反推其运算过程。742 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式例2-14 自加自减运算main()int i=5;printf(n%d,-i+);printf(n%d,-+i);其运行的结果为:-5-7752 26 6
43、运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式例2-15 复杂的自加自减运算main()int i=5,j=5,k=5,p,q,r;p=(i+)+(i+)+(i+);q=(+j)+(+j)+(+j);r=k+1;printf(ni=%d,p=%d,i,p);printf(nj=%d,q=%d,j,q);printf(nk=%d,r=%d,k,r);762 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式该程序运行结果为:i=8,p=15j=8,q=24k=6,r=6772 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符
44、和算术表达式术表达式l5各数值类型数据间的混合运算 整型、字符型和实型之间可以混合运算,但在运算的时候,不同类型的数据需要进行自动转换,其规律是:(1)字符型(char)和短整型(short)必定先转换为整型(int);(2)float型一律转换为double型(可以提高运算精度);782 26 6 运算符和表达式运算符和表达式算术运算符和算算术运算符和算术表达式术表达式(3)当运算对象为不同类型时,转换方向是:intunsignedlongdouble 例如:int型与double型运算,先将int型对象转换为double型后运算。792 26 6 运算符和表达式运算符和表达式赋值运算符和赋
45、赋值运算符和赋值表达式值表达式 l1简单赋值运算符 简单赋值运算用“”表示,基本格式为:变量表达式变量表达式 其含义是把右边的表达式的值赋给左边的变量。也可以用连等的形式:变量1变量2变量n=表达式。例如:i=j=5(设i和j为整型变量);注意赋值运算是右结合的,因此连等相当于:变量n=表达式;变量n-1=变量n;变量1变量2;802 26 6 运算符和表达式运算符和表达式赋值运算符和赋赋值运算符和赋值表达式值表达式 下面给出一些赋值表达式的例子:x=a+b w=sin(a)+sin(b)y=i+-j a=b=c=5可理解为a=(b=(c=5)可以说,凡是表达式可以出现的地方均可出现赋值表达式
46、。例如,式子:x=(a=5)+(b=8)812 26 6 运算符和表达式运算符和表达式赋值运算符和赋赋值运算符和赋值表达式值表达式l2复合赋值表达式 赋值符“=”之前加上其它一些运算符可构成复合赋值符。如+=,-=,*=,=,%=,=,&=,=,|=。构成复合赋值表达式的一般形式为:变量 双目运算符=表达式 它等效于 变量=变量 运算符(表达式)例如:a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7)r%=p 等价于r=r%p 注意有个括号822 26 6 运算符和表达式运算符和表达式赋值运算符和赋赋值运算符和赋值表达式值表达式l3赋值运算中的类型转换(1)实型赋予整型,舍去小
47、数部分。(2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。(3)字符型赋予基本整型,由于字符型为只占一个字节,而整型占二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位的值根据不同的系统确定是否进行符号扩展。(4)短整型(基本整型)赋予长整型,与字符型赋予基本整型类似,将整个数据写入长整型的低16位,高16位的值也根据系统来确定是否进行符号扩展。(5)整型赋予字符型,只把低八位赋予字符量。832 26 6 运算符和表达式运算符和表达式赋值运算符和赋赋值运算符和赋值表达式值表达式例2-16 类型转换程序之一。main()int a;long int
48、 b=112768;a=b;printf(n%d,a);其运行结果为:18304842 26 6 运算符和表达式运算符和表达式赋值运算符和赋赋值运算符和赋值表达式值表达式例2-17类型转换程序之二。main()int a,b=322,c;char c1=a,c2;float x,y=35600.35;a=y;x=b;c=c1;c2=b;printf(na=%d,x=%f,c=%d,c2=%d,a,x,c,c2);该程序运行的结果是:a=29936,,x=322.000000,c=97,c2=66852 26 6 运算符和表达式运算符和表达式关系运算符和关关系运算符和关系表达式系表达式 关系运算
49、符是用于两两之间比较大小,C语言提供了6种关系运算符:(小于)、(大于)、=(大于或等于)、=(等于)、!=(不等于)。关系表达式的格式为:表达式1 关系运算符 表达式2 例如:a9 862 26 6 运算符和表达式运算符和表达式关系运算符和关关系运算符和关系表达式系表达式 可以认为关系表达式的值为“真(True)”或“假(false)”,但是C语言中没有逻辑量。关系表达式的值要么是1,要么是0。如果关系成立,则关系表达式的值为1,否则为0。表达式的值(3+4)9的值为0,可以用printf(“%d”,(3+4)9)语句来验证。第三章中将进一步讲述关系表达式的使用。872 26 6 运算符和表
50、达式运算符和表达式逻辑运算符和逻逻辑运算符和逻辑表达式辑表达式 C语言提供三种逻辑运算符:&(逻辑与)、|(逻辑或)、!(逻辑非)。由逻辑运算符构成的表达式为逻辑表达式。&运算要求两个操作数,当两个操作数都为“真”时表达式的值为“真”,否则为假;|运算也需要两个操作数,当其中之一为“真”时,整个表达式就为“真”,否则为假;!为单目运算符,若操作数为“真”,则其逻辑非为“假”,若操作数为“假”,则其逻辑非为“真”。第三章进一步讲述关系表达式的使用。882 26 6 运算符和表达式运算符和表达式逗号运算符和逗逗号运算符和逗号表达式号表达式 在语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是