三章节数据类型运算符与表达式.PPT
失之毫厘,谬以千里失之毫厘,谬以千里三章节数据类型运算符与表达式 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望失之毫厘,谬以千里失之毫厘,谬以千里3 3、1 C1 C的数据类型的数据类型所谓数据结构指的是数据的组织形式。所谓数据结构指的是数据的组织形式。所谓数据结构指的是数据的组织形式。所谓数据结构指的是数据的组织形式。基本类型基本类型基本类型基本类型构造类型构造类型构造类型构造类型指针类型指针类型指针类型指针类型空类型空类型空类型空类型整型整型整型整型实型实型实型实型字符型字符型字符型字符型枚举型枚举型枚举型枚举型数组类型数组类型数组类型数组类型结构体类型结构体类型结构体类型结构体类型共用体类型共用体类型共用体类型共用体类型单精度型单精度型单精度型单精度型双精度型双精度型双精度型双精度型C C C C语言中的数据有常量和变量之分,它们分属于以上类型。语言中的数据有常量和变量之分,它们分属于以上类型。语言中的数据有常量和变量之分,它们分属于以上类型。语言中的数据有常量和变量之分,它们分属于以上类型。数据类型数据类型数据类型数据类型在程序中对用到的所有数据变量都必须指定其数据类型。在程序中对用到的所有数据变量都必须指定其数据类型。失之毫厘,谬以千里失之毫厘,谬以千里3 3、2 2 常量和变量常量和变量 1 1、常量、常量、常量、常量 在程序运行过程中其值不能改变的量称为常量。一在程序运行过程中其值不能改变的量称为常量。一在程序运行过程中其值不能改变的量称为常量。一在程序运行过程中其值不能改变的量称为常量。一般从其字面形式即可判别。般从其字面形式即可判别。般从其字面形式即可判别。般从其字面形式即可判别。整型常量:整型常量:整型常量:整型常量:12121212,0 0 0 0,345345345345 实型常量:实型常量:实型常量:实型常量:44.6,-1.23,1.2E-3,6e+244.6,-1.23,1.2E-3,6e+244.6,-1.23,1.2E-3,6e+244.6,-1.23,1.2E-3,6e+2 字符常量:字符常量:字符常量:字符常量:aaaa、DDDD、dddd 字符串常量:字符串常量:字符串常量:字符串常量:“This is a program.”This is a program.”This is a program.”This is a program.”2 2、符号常量、符号常量、符号常量、符号常量 符号常量:用一个标识符代表一个常量。符号常量:用一个标识符代表一个常量。符号常量:用一个标识符代表一个常量。符号常量:用一个标识符代表一个常量。失之毫厘,谬以千里失之毫厘,谬以千里#define PRICE 30#define PRICE 30#define PRICE 30#define PRICE 30 main()main()main()main()int num=10,total;int num=10,total;int num=10,total;int num=10,total;total=num*PRICE;/*total=num*PRICE;/*total=num*PRICE;/*total=num*PRICE;/*相当于相当于相当于相当于total=num*30;*/total=num*30;*/total=num*30;*/total=num*30;*/运行结果:运行结果:运行结果:运行结果:total=300 total=300 total=300 total=300 符号常量使用注意事项符号常量使用注意事项符号常量使用注意事项符号常量使用注意事项(1)(1)一般符号常量用大写字母取名一般符号常量用大写字母取名(2)(2)符号常量的值在其作用域内不能改变符号常量的值在其作用域内不能改变 即程序里不能出现即程序里不能出现 PRICE=40 PRICE=40;语句;语句失之毫厘,谬以千里失之毫厘,谬以千里3 3、变量、变量 1)标识符:)标识符:用来作为变量名、符号常量名、函数名、数组名、用来作为变量名、符号常量名、函数名、数组名、文件名等的有效字符序列称为标识符文件名等的有效字符序列称为标识符 规定:(规定:(1 1)标识符只能由字母,数字和下划)标识符只能由字母,数字和下划 线组成,且以字母或下划线开头线组成,且以字母或下划线开头 建议不超过建议不超过 8 8 个字符。个字符。(2 2)大小写分别表示不同的标识符。)大小写分别表示不同的标识符。2 2)关键字(保留字):)关键字(保留字):一些在编译过程中起特殊作用的标识符。一些在编译过程中起特殊作用的标识符。如:如:char,int,short,float,doublechar,int,short,float,double if,else,while,if,else,while,等共计等共计3232个个失之毫厘,谬以千里失之毫厘,谬以千里3 3)变)变 量量 程序运行过程中其值可以改变的量称为变量。变程序运行过程中其值可以改变的量称为变量。变量应该有名字,并在内存中占有一定的存储单元。量应该有名字,并在内存中占有一定的存储单元。变量名是一个标识符。变量名是一个标识符。合法的变量名:合法的变量名:sum,_above,class1,basic sum,_above,class1,basic不合法的变量名:不合法的变量名:M.D.John,3D64,ab,#33,$234 M.D.John,3D64,ab,#33,$234注意:(注意:(1 1)变量名一般用小写字母表示)变量名一般用小写字母表示 (2 2)起变量名应遵循)起变量名应遵循“见名知义见名知义”原则原则 (3 3)变量名不能与关键字同名。)变量名不能与关键字同名。失之毫厘,谬以千里失之毫厘,谬以千里4 4)变量的定义及其目的变量的定义及其目的例:例:int a,b,c;int a,b,c;char c1,c2;char c1,c2;其目的为:其目的为:(1 1)凡未被定义的,不作变量名使用;)凡未被定义的,不作变量名使用;(2 2)指定变量类型后,系统编译时可分配相应)指定变量类型后,系统编译时可分配相应 的存储单元;的存储单元;(3 3)定义变量类型便于编译时检查此变量所)定义变量类型便于编译时检查此变量所 进行的运算是否合法。进行的运算是否合法。C C中变量应先定义后使用。中变量应先定义后使用。失之毫厘,谬以千里失之毫厘,谬以千里 计算机内部的数据和计算机内部的数据和C C语言的数据都是以二进语言的数据都是以二进制补码表示的。补码的最高位为符号位,若为制补码表示的。补码的最高位为符号位,若为0 0,该数为正数;若为该数为正数;若为1 1,该数为负数。符号位与数值,该数为负数。符号位与数值位一起参与运算。位一起参与运算。正数的补码即其本身。负数的补码可这样求出:正数的补码即其本身。负数的补码可这样求出:(1 1)先求该数的绝对值,再求出对应正数的二进)先求该数的绝对值,再求出对应正数的二进制编码;制编码;(2 2)对二进制编码按位取反;)对二进制编码按位取反;(3 3)对最低位加)对最低位加1 1。补充:数的补码表示补充:数的补码表示失之毫厘,谬以千里失之毫厘,谬以千里求求-2-2的补码(以两个字节表示)的补码(以两个字节表示)(1)(1)求求-2-2的绝对值,的绝对值,|-2|=2|-2|=2,二进制编码为:二进制编码为:0000 0000 0000 00100000 0000 0000 0010(2 2)按位取反得:)按位取反得:1111 1111 1111 11011111 1111 1111 1101(3 3)最低位加)最低位加1 1:1111 1111 1111 1101 1111 1111 1111 1101 1 1111 1111 1111 1110 1111 1111 1111 1110失之毫厘,谬以千里失之毫厘,谬以千里3 3、3 3 整型数据整型数据1 1、整型常量、整型常量C C整常数有三种表示形式:整常数有三种表示形式:十进制:十进制:123123,456456,0 0八进制:以八进制:以0 0开头,开头,如:如:0123 0123 等于十进制数等于十进制数8383 011 011 等于十进制数等于十进制数9 9 十六进制:以十六进制:以0 x0 x或或0X0X打头打头 如:如:0 x123 0 x123 等于十进制数等于十进制数291291 0 x12 0 x12 等于十进制数等于十进制数1818注注:负数在计算机中表示形式?负数在计算机中表示形式?失之毫厘,谬以千里失之毫厘,谬以千里2 2、整型变量整型变量整型变量整型变量基本整型基本整型 int int短整型短整型 shortint shortint 长整型长整型 long(int)long(int)无符号型无符号型无符号整型无符号整型unsigned intunsigned int无符号长整型无符号长整型unsigned longunsigned long无符号短整型无符号短整型unsigned shortunsigned short失之毫厘,谬以千里失之毫厘,谬以千里数据类型(关键字数据类型(关键字)字节个数字节个数取值范围取值范围short2-32768+32767unsigned short20+65535int2-32768+32767unsigned20+65535long4-21474836482147483647unsigned long404294967295失之毫厘,谬以千里失之毫厘,谬以千里0 0 0 0 0 0 00 0 0 0 1 1 0 10int 型0 0 0 0 1 1 0 10 0 0 0 0 0 0 0unsigned int 整数整数1313在存储单元中的存储情况在存储单元中的存储情况失之毫厘,谬以千里失之毫厘,谬以千里3 3、整型变量的定义及使用整型变量的定义及使用程序中用到的变量都必须先定义,例如:程序中用到的变量都必须先定义,例如:运行结果:a+u=22,b+u=-14失之毫厘,谬以千里失之毫厘,谬以千里4 4、整型数据的溢出整型数据的溢出 一个一个intint型变量的最大允许值是型变量的最大允许值是32767,32767,如果再加如果再加1,1,其结果会是怎样一种情况其结果会是怎样一种情况?0111111111111111 数值数值:32767:32767+0000000000000001 数值数值:1:1 1000000000000000 数值数值:-32768:-32768=它就好像汽车的里程表一样它就好像汽车的里程表一样,达到最大值后达到最大值后,又又从最小的开始计数从最小的开始计数.失之毫厘,谬以千里失之毫厘,谬以千里5 5、整型常量的类型整型常量的类型1.1.值在值在32768327683276732767的整常数,认为它是的整常数,认为它是intint型,型,可赋给可赋给 int int 型和型和 long int long int 型变量型变量;2.2.值超过上述范围,而在值超过上述范围,而在2 2 2 21 1的整常数,的整常数,认为它是认为它是 long int long int 型型,可赋给可赋给 long int long int 型变量型变量;3.3.只有非负的整常数可赋给只有非负的整常数可赋给 unsigned unsigned型变量型变量,但但 值不能超出该值不能超出该 unsigned unsigned 型变量的取值范围型变量的取值范围;4.4.整常量后加一个整常量后加一个l l 或或L L,则认为其为,则认为其为 long int long int 型型 常量常量,如:如:123L123L,0L0L,432L432L 此常用于函数调用中此常用于函数调用中,使形参类型匹配于实参类型。使形参类型匹配于实参类型。3131失之毫厘,谬以千里失之毫厘,谬以千里3 3、4 4实型数据实型数据1 1、实型常量、实型常量 1)十进制数形式:由数字和小数点组成十进制数形式:由数字和小数点组成 如如:0.0,0.123,-34.6,.678,90.:0.0,0.123,-34.6,.678,90.注意:小数点必须有,且其前后数字不能同时缺省。注意:小数点必须有,且其前后数字不能同时缺省。2)2)指数形式(科学计数法指数形式(科学计数法):):由尾数,指数和由尾数,指数和 字母字母e e或或E E组成组成 如:如:123E3 123E3 代表代表 12310 12310 注意:注意:E E前必须有数字,前必须有数字,E E后必须为整数后必须为整数 E5 3.4E5.6 E5 3.4E5.6 不合法不合法3失之毫厘,谬以千里失之毫厘,谬以千里 3)规范化的规范化的指数指数(输出输出)形式形式:即在字母即在字母e e或或E E之前的小之前的小数部分中数部分中,小数点左边应有一位且只能有一位非零的数小数点左边应有一位且只能有一位非零的数字。字。如:如:2.3478e22.3478e2、3.099E5 3.099E5 等等等等.4)4)实型数据在内存的存放形式实型数据在内存的存放形式:实型数据是按指数形实型数据是按指数形式存储的式存储的,系统把一个实型数据分成小数部分系统把一个实型数据分成小数部分(.xxxxx)(.xxxxx)和指数部分和指数部分(采用规范化的指数形式采用规范化的指数形式),),分别存放分别存放.如如:3.14159:3.14159+.314159 1 小数部分占的位数越多小数部分占的位数越多,精度越高精度越高;指数部分占指数部分占的位数越多的位数越多,可表示数值范围越大可表示数值范围越大.失之毫厘,谬以千里失之毫厘,谬以千里2 2、实型变量、实型变量单精度型(单精度型(floatfloat)32 32位位 7 7位有效数字位有效数字 10 10 10 10 双精度型(双精度型(doubledouble)64 64位位 15 1516 16 位有效数字位有效数字 10 10 10 10 3838308308定义实型变量:定义实型变量:float x,y;float x,y;double z,a,b;double z,a,b;失之毫厘,谬以千里失之毫厘,谬以千里3 3、实型变量的赋值、实型变量的赋值 实型常量不分实型常量不分 float float型和型和doubledouble型型,系统按系统按doubledouble型处理型处理,若按若按floatfloat型处理型处理,可在数值后面加可在数值后面加f f或或F.F.一个实型常量可赋给一个实型变量(一个实型常量可赋给一个实型变量(float float型或型或doubledouble型),根据变量类型截取实常量中相应的有效型),根据变量类型截取实常量中相应的有效位数。位数。例:例:float x;double y;则:则:x=222222.222 y=222222.222 注意实型数据的舍入误差;应当避免将一个很大的数和一个很小的数直接相加减;同理1.0/3*3!=1失之毫厘,谬以千里失之毫厘,谬以千里3.5 3.5 字符型数据字符型数据1 1 1 1、字符常量、字符常量、字符常量、字符常量 1 1)一般形式字符常量:一般形式字符常量:用单引号括起来的单个字符。如:用单引号括起来的单个字符。如:A A,?,=2 2)转义字符序列:转义字符序列:以以 开头的字符序列,可表示任何开头的字符序列,可表示任何可输出的字母字符,专用字符,图形字符可输出的字母字符,专用字符,图形字符和控制字符如和控制字符如nn为换行控制符为换行控制符 失之毫厘,谬以千里失之毫厘,谬以千里n n n n 换行将当前位置移到下一行开头换行将当前位置移到下一行开头换行将当前位置移到下一行开头换行将当前位置移到下一行开头 t t t t 水平制表水平制表水平制表水平制表(跳到下一个跳到下一个跳到下一个跳到下一个tabtabtabtab位置位置位置位置)b b b b 退格退格退格退格,将当前位置移到前一列将当前位置移到前一列将当前位置移到前一列将当前位置移到前一列r r r r 回车回车回车回车,将当前位置移到本行开头将当前位置移到本行开头将当前位置移到本行开头将当前位置移到本行开头f f f f 换页换页换页换页,将当前位置移到本页开头将当前位置移到本页开头将当前位置移到本页开头将当前位置移到本页开头 反斜杠字符反斜杠字符反斜杠字符反斜杠字符 单引号单引号单引号单引号(撇号撇号撇号撇号)字符字符字符字符”双引号字符双引号字符双引号字符双引号字符ddd 1ddd 1ddd 1ddd 1到到到到3 3 3 3位位位位8 8 8 8进制数所代表的字符进制数所代表的字符进制数所代表的字符进制数所代表的字符xhh 1xhh 1xhh 1xhh 1到到到到2 2 2 2位位位位16161616进制数所代表的字符进制数所代表的字符进制数所代表的字符进制数所代表的字符失之毫厘,谬以千里失之毫厘,谬以千里2 2、字符变量字符变量 用来存放一个字符常量。用来存放一个字符常量。用来存放一个字符常量。用来存放一个字符常量。定义形式:定义形式:char c1,c2;赋值:赋值:c1=c1=O O;c2=;c2=K K;则:则:printf(printf(%c%c n%c%c n ,c1,c2);,c1,c2);输出:输出:O KO K一个字符变量在内存中占一个字节。一个字符变量在内存中占一个字节。失之毫厘,谬以千里失之毫厘,谬以千里3 3、字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法 1 1)字符数据在内存中存放的是其)字符数据在内存中存放的是其ASCIIASCII值。值。例:例:char c1,c2;char c1,c2;c1=c1=a a;c2=;c2=b b;则:则:9798c1c20 1 1 0 0 0 0 10 1 1 0 0 0 1 0失之毫厘,谬以千里失之毫厘,谬以千里2 2)C C中,整型数据和字符型数据之间可通用中,整型数据和字符型数据之间可通用 (1 1)程序中,字符数据既可按字符形式输出,)程序中,字符数据既可按字符形式输出,也可以整数形式输出。也可以整数形式输出。由输出格式字符串由输出格式字符串%c%c 和和%d%d 决定。决定。(2 2)字符数据可进行算术运算,字符变量)字符数据可进行算术运算,字符变量 既可赋值以字符常量,也可赋以相应的既可赋值以字符常量,也可赋以相应的 ASCII ASCII值。值。C C的整型数据与字符数据间可相互赋值。的整型数据与字符数据间可相互赋值。失之毫厘,谬以千里失之毫厘,谬以千里运行结果:运行结果:a b a b A B A B失之毫厘,谬以千里失之毫厘,谬以千里4 4、字符串常量字符串常量一对双引号括起来的字符序列。例:一对双引号括起来的字符序列。例:a a,How do you do.How do you do.,China China,abcn abcn,$123.45$123.45C C规定:规定:在内存中,系统自动在每个字符串的在内存中,系统自动在每个字符串的结尾加上一个字符串结束标志结尾加上一个字符串结束标志00,以便,以便系统据此判断字符串结束标志。系统据此判断字符串结束标志。所以,所以,“a”“a”在内存中占两个字节。在内存中占两个字节。a0失之毫厘,谬以千里失之毫厘,谬以千里char c;char c;c=c=a a;c=c=a a;C C 中无专门的字符串变量,如需要,可用中无专门的字符串变量,如需要,可用字符数组来存放。字符数组来存放。注意:字符常量和字符串常量不可混淆。注意:字符常量和字符串常量不可混淆。失之毫厘,谬以千里失之毫厘,谬以千里3.6 3.6 变量赋初值变量赋初值例例例例1 1:int a=3 int a=3;float f=3.56 float f=3.56;char c=a;char c=a;例例例例2 2:int a,b,c=3;int a,b,c=3;错例:错例:错例:错例:int a=b=c=3;int a=b=c=3;此些变量的初始化不是在编译阶段完成此些变量的初始化不是在编译阶段完成,而是在程序执行本函数时赋予初值的而是在程序执行本函数时赋予初值的,相当于相当于有一个赋值语句。有一个赋值语句。失之毫厘,谬以千里失之毫厘,谬以千里3.7 3.7 数值型数据间的混合运算数值型数据间的混合运算C C中,整型,字符型,实型(包括单精度,中,整型,字符型,实型(包括单精度,双精度)数据可出现在一个表达式中进行双精度)数据可出现在一个表达式中进行混合运算。混合运算。类型自动转换规则类型自动转换规则高高低低double floatlongunsignedint char,short失之毫厘,谬以千里失之毫厘,谬以千里例:例:int i;floatint i;float f;f;double d;long e;double d;long e;则:则:10 10 a a+i*f-d/e +i*f-d/e 合法合法转换次序:转换次序:(1 1)计算)计算 10 10a a,结果为整数结果为整数107107 (2 2)计算)计算 i*f,i*f,结果为结果为doubledouble型型 (3 3)整数)整数107107与与i*fi*f的积相加,结果为的积相加,结果为doubledouble型型 (4 4)计算)计算 d/e d/e,结果为结果为doubledouble型型 (5 5)将)将1010a a+i*f+i*f 的结果与的结果与 d/e d/e 的商的商 相减,结果为相减,结果为doubledouble型。型。失之毫厘,谬以千里失之毫厘,谬以千里3 3、8 8 算术运算符和算术表达式算术运算符和算术表达式1 1、运算符的种类、优先级和结合性、运算符的种类、优先级和结合性 语言中运算符和表达式数量之多,语言中运算符和表达式数量之多,在高级在高级语言中是少见的。正是丰富的运算符和表达式使语言中是少见的。正是丰富的运算符和表达式使语言功能十分完善。语言功能十分完善。这也是语言的主要特点这也是语言的主要特点之一。之一。语言的运算符不仅具有不同的优先级,语言的运算符不仅具有不同的优先级,而而且还有一个特点,就是它的结合性。在表达式中,且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,优先级别的规定,还要受运算符结合性的制约,以以便确定是自左向右进行运算还是自右向左进行运算。便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此这种结合性是其它高级语言的运算符所没有的,因此也增加了语言的复杂性。也增加了语言的复杂性。失之毫厘,谬以千里失之毫厘,谬以千里失之毫厘,谬以千里失之毫厘,谬以千里2.2.算术运算符和算术表达式算术运算符和算术表达式1 1)基本算术运算符基本算术运算符 */%*/%(模除,或称求余)(模除,或称求余)例:例:7%3 7%3 值为值为 1 1 5/3=1,-5/3=-1 5/3=1,-5/3=-1 若参加运算的两个数中有一个为实数,则若参加运算的两个数中有一个为实数,则结果为结果为doubledouble型。型。求余运算(求余运算(%)要求参与运算的量均为整型。)要求参与运算的量均为整型。其结果等于两数相除后的余数。其结果等于两数相除后的余数。失之毫厘,谬以千里失之毫厘,谬以千里main()main()printf(nn%d,%dn,20/7,-20/7);printf(nn%d,%dn,20/7,-20/7);printf(%f,%fn,20.0/7,-20.0/7);printf(%f,%fn,20.0/7,-20.0/7);参与运算量均为整型时,参与运算量均为整型时,结果也为整型,舍去小数。结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。如果运算量中有一个是实型,则结果为双精度实型。本例中,本例中,20/720/7,-20/7-20/7的结果均为整型,小数全部舍的结果均为整型,小数全部舍去。而去。而 20.0/7 20.0/7和和-20.0/7-20.0/7由于有实数参与运算,因此由于有实数参与运算,因此结果也为实型。结果也为实型。失之毫厘,谬以千里失之毫厘,谬以千里2 2)算术表达式算术表达式 表达式是由常量、变量、函数和运算符组合起来表达式是由常量、变量、函数和运算符组合起来的式子。的式子。一个表达式有一个值及其类型,一个表达式有一个值及其类型,它们等于它们等于计算表达式所得结果的值和类型。表达式求值按运算计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。符的优先级和结合性规定的顺序进行。单个的常量、单个的常量、变量、函数可以看作是表达式的特例。变量、函数可以看作是表达式的特例。算术表达式是由算术运算符和括号连接起来的式算术表达式是由算术运算符和括号连接起来的式子,子,以下是算术表达式的例子:以下是算术表达式的例子:a+b (a*2)a+b (a*2)c (x+r)*8-(a+b)c (x+r)*8-(a+b)7 7 +i sin(x)+sin(y)(+i)-(j+)+(k-)+i sin(x)+sin(y)(+i)-(j+)+(k-)失之毫厘,谬以千里失之毫厘,谬以千里注意:注意:C C语言算术表达式的书写形式类似于数学中语言算术表达式的书写形式类似于数学中的代数表达式,但有区别:的代数表达式,但有区别:(1)a*b (1)a*b 不能写为不能写为 ab ab、ab ab、a.ba.b(2)c/d (2)c/d 不能写为不能写为 cd cd、cd(3)e-(f+(g-h)/(i-j)+k (3)e-(f+(g-h)/(i-j)+k 不能写为不能写为 e-f+(g-h)/(i-j)+k e-f+(g-h)/(i-j)+k(4)3.14*r*r (4)3.14*r*r 不能写为不能写为*r*2*r*2 或或 3.14*r2 3.14*r2(5)sin(x)(5)sin(x)不能写为不能写为 sinx sinx(6)log(x)(6)log(x)不能写为不能写为 lnx lnx log10(x)log10(x)不能写为不能写为 logx logx10失之毫厘,谬以千里失之毫厘,谬以千里3 3、算术运算符的优先级和结合性算术运算符的优先级和结合性1 1)优先级:指表达式运算时应按运算符的优先级:指表达式运算时应按运算符的优先级别高低次序进行,例:优先级别高低次序进行,例:()高高 */%*/%+-+-低低 如:如:a-b*c a-b*c 相当于相当于 a-(b*c)a-(b*c)失之毫厘,谬以千里失之毫厘,谬以千里2 2)结合性:先按运算符的优先级别高低依次进行结合性:先按运算符的优先级别高低依次进行.若在一个运算对象两侧的运算符的优先级相同,若在一个运算对象两侧的运算符的优先级相同,则按规定的则按规定的“结合方向结合方向”处理。处理。算术运算符的结合方向自左向右算术运算符的结合方向自左向右:运算对象先运算对象先与左面的运算符结合与左面的运算符结合.称为称为 左结合性。左结合性。例:例:a-b+c a-b+c 相当于相当于 (a-b)+c (a-b)+c失之毫厘,谬以千里失之毫厘,谬以千里4 4、强制类型转换运算强制类型转换运算 作用作用 :将一个表达式转换成所需类型:将一个表达式转换成所需类型 形式形式 :(类型名)(表达式):(类型名)(表达式)例:例:(double)a(double)a (int)(x+y)(int)(x+y)(float)(5%3)(float)(5%3)说明:强制类型转换时,得到一个所需类型的说明:强制类型转换时,得到一个所需类型的中间变量,而原来变量的类型未发生变化。中间变量,而原来变量的类型未发生变化。举例:举例:float x=2.5;int i;i=(int)x;float x=2.5;int i;i=(int)x;失之毫厘,谬以千里失之毫厘,谬以千里5 5、自增,自减运算符、自增,自减运算符 自增运算符记为自增运算符记为“+”“+”,其功能是使变量的值自增,其功能是使变量的值自增1 1。自减运算符记为自减运算符记为“-”“-”,其功能是使变量值自减,其功能是使变量值自减1 1。可有以下几种形式:可有以下几种形式:+i i+i i自增自增1 1后后i i再参与表达式整体的其它运算。再参与表达式整体的其它运算。-i i-i i自减自减1 1后后i i再参与表达式整体的其它运算。再参与表达式整体的其它运算。i+ii+i参与表达式整体的运算后,参与表达式整体的运算后,i i的值再自增的值再自增1 1。i-ii-i参与表达式整体的运算后,参与表达式整体的运算后,i i的值再自减的值再自减1 1。在理解和使用上容易出错的是在理解和使用上容易出错的是i+i+和和i-i-。特别是当特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。此应仔细分析。失之毫厘,谬以千里失之毫厘,谬以千里注意:注意:1 1)自增、自减运算符只能用于变量,而不能用于)自增、自减运算符只能用于变量,而不能用于常量或表达式。如常量或表达式。如 5+5+(a+ba+b)+都是不合法的。都是不合法的。2 2)+和和-的结合方向是的结合方向是“自右向左自右向左”。如。如 -i+-i+应理解为应理解为-(i+i+)而不是而不是 (-i-i)+3 3)自增、自减运算符常用于循环语句中)自增、自减运算符常用于循环语句中,使循环变使循环变量自动加量自动加1,1,也用于指针变量也用于指针变量,使指针指向下一个地址使指针指向下一个地址.失之毫厘,谬以千里失之毫厘,谬以千里 main()main()int i=8;int i=8;printf(%dn,+i);9 printf(%dn,+i);9 printf(%dn,-i);8 printf(%dn,-i);8 printf(%dn,i+);8 printf(%dn,i+);8 printf(%dn,i-);9 printf(%dn,i-);9 printf(%dn,-i+);-8 printf(%dn,-i+);-8 printf(%dn,-i-);-9 printf(%dn,-i-);-9 i i的初值为的初值为8 8,第,第2 2行行i i加加1 1后输出为后输出为9 9;第;第3 3行减行减1 1后输出后输出为为8 8;第;第4 4行输出行输出i i为为8 8之后再加之后再加1(1(为为9)9);第;第5 5行输出行输出i i为为9 9之后再减之后再减1(1(为为8)8);第;第6 6行输出行输出-8-8之后再加之后再加1(1(为为9)9),第,第7 7行输出行输出-9-9之后再减之后再减1(1(为为8)8)。失之毫厘,谬以千里失之毫厘,谬以千里 main()main()int i=5,j=5,p,q;int i=5,j=5,p,q;p=(i+)+(i+)+(i+);p=(i+)+(i+)+(i+);q=(+j)+(+j)+(+j);q=(+j)+(+j)+(+j);printf(%d,%d,%d,%d,p,q,i,j);printf(%d,%d,%d,%d,p,q,i,j);i-5,j-5 i-5,jp,i+1-i,i+1-i,i+1-i i+i+i-p,i+1-i,i+1-i,i+1-i j+1-j,j+1-j,j+1-j,j+j+j-q j+1-j,j+1-j,j+1-j,j+j+j-q 这个程序中,对这个程序中,对P=(i+)+(i+)+(i+)P=(i+)+(i+)+(i+)应理解为三应理解为三个个i i相加,故相加,故P P值为值为1515。然后。然后i i再自增再自增1 1三次相当于加三次相当于加3 3故故i i的最后值为的最后值为8 8。而对于而对于q q 的值则不然,的值则不然,q=(+j)+(+j)+(+j)q=(+j)+(+j)+(+j)应理应理解为解为q q先自增先自增1 1,再参与运算,由于,再参与运算,由于q q自增自增1 1三次后值为三次后值为8 8,三个三个8 8相加的和为相加的和为2424,j j的最后值仍为的最后值仍为8 8。失之毫厘,谬以千里失之毫厘,谬以千里3 3、9 9 赋值运算符和赋值表达式赋值运算符和赋值表达式 1 1、简单赋值运算符和表达式、简单赋值运算符和表达式 简单赋值运算符记为简单赋值运算符记为“=”“=”。由。由“=”“=”连接连接 的式子称为赋值表达式。其一般形式为:的式子称为赋值表达式。其一般形式为:变量变量=表达式表达式 例如:例如:例如:例如:x=a+bx=a+b w=sin(a)+sin(b)w=sin(a)+sin(b)y=i+-j y=i+-j 赋值表达式的功能是计算表达式的值再赋予左边赋值表达式的功能是计算表达式的值再赋予左边 的变量。赋值运算符具有右结合性。因此的变量。赋值运算符具有右结合性。因此 a=b=c=5 a=b=c=5 可理解为可理解为 a=(b=(c=5)a=(b=(c=5)失之毫厘,谬以千里失之毫厘,谬以千里关于简单赋值运算符及赋值表达式的说明:关于简单赋值运算符及赋值表达式的说明:1 1)在其它高级语言中,赋值构成了一个语句,称为)在其它高级语言中,赋值构成了一个语句,称为赋值语句。赋值语句。而在而在C C中,把中,把“=”“=”定义为运算符,从而组定义为运算符,从而组成赋值表达式。成赋值表达式。凡是表达式可以出现的地方均可出现凡是表达式可以出现的地方均可出现赋值表达式。例如,式子赋值表达式。例如,式子x=(a=5)+(b=8)x=(a=5)+(b=8)是合法的。它是合法的。它的意义是把的意义是把5 5赋予赋予a a,8 8赋予赋予b b,再把表达式,再把表达式a=5,b=8a=5,b=8的值的值相加,和赋予相加,和赋予x x,故,故x x应等于应等于1313。2 2)在语言中也可以组成赋值语句,按照语言规)在语言中也可以组成赋值语句,按照语言规定,定,任何表达式在其未尾加上分号就构成为语句。因任何表达式在其未尾加上分号就构成为语句。因此,如此,如x=8;a=b=c=5x=8;a=b=c=5;都是赋值语句。;都是赋值语句。失之毫厘,谬以千里失之毫厘,谬以千里赋值时的类型转换赋值时的类型转换 如果赋值运算符两边的数据类型不相同,如果赋值运算符两边的数据类型不相同,系统将自系统将自动进行类型转换,即把赋值号右边的类型换成左边的类动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:型。具体规定如下:1.1.实型赋予整型,舍去小数部分。前面的例子已经实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。说明了这种情况。2.2.整型赋予实型,数值不变,但将以浮点形式存放,整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分即增加小数部分(小数部分的值为小数部分的值为0)0)。3.3.字符型赋予整型,由于字符型为一个字节,字符型赋予整型,由于字符型为一个字节,而整而整型为二个字节,故将字符的型为二个字节,故将字符的ASCIIASCII码值放到整型量的低八码值放到整型量的低八位中,高八位为位中,高八位为0 0。4.4.整型赋予字符型,只把低八位赋予字符量。整型赋予字符型,只把低八位赋予字符量。失之毫厘,谬以千里失之毫厘,谬以千里 main()int a,b=322;float x,y=8.88;char c1=k,c2;a=y;x=b;a=c1;c2=b;printf(%d,%f,%d,%c,a,x,a,c2);本例表明了上述赋值运算中类型转换的规则:本例表明了