《第二章.数据类型、运算符与表达式》由会员分享,可在线阅读,更多相关《第二章.数据类型、运算符与表达式(32页珍藏版)》请在金锄头文库上搜索。
1、第第第第2 2 2 2章章章章章章 数据类型数据类型数据类型数据类型、运算符运算符运算符运算符与表达式与表达式与表达式与表达式 程序是解决某种问题的一组指令的有序集合。 著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式: 程序 = 数据结构 + 算法 u学习的意义学习的意义 程序是什么?程序是什么?对数据的描述。对数据的描述。对数据的描述。对数据的描述。在在在在C C C C语语语语言中,体现为言中,体现为言中,体现为言中,体现为数据类数据类数据类数据类型型型型的描述!的描述!的描述!的描述!对数据处理的描述。对数据处理的描述。对数据处理的描述。对数据处理的描述。是为解决是为
2、解决是为解决是为解决一个问题而采取的方法和步骤,一个问题而采取的方法和步骤,一个问题而采取的方法和步骤,一个问题而采取的方法和步骤,是程序的灵魂!是程序的灵魂!是程序的灵魂!是程序的灵魂! 结论:学好结论:学好C C语言首先语言首先就必须十分了解就必须十分了解C C语言语言的数据类型、的数据类型、运运算符算符与表达式。与表达式。C C C C数数数数据据据据类类类类型型型型基本类型基本类型基本类型基本类型构造类型构造类型构造类型构造类型指针类型指针类型指针类型指针类型空类型空类型空类型空类型voidvoid字符类型字符类型字符类型字符类型charchar枚举类型枚举类型枚举类型枚举类型enum
3、enum整整整整数数数数型型型型浮点型浮点型浮点型浮点型单精度型单精度型单精度型单精度型floatfloat双精度型双精度型双精度型双精度型doubledouble数组数组数组数组结构体结构体结构体结构体structstruct共用体共用体共用体共用体unionunion短整型短整型短整型短整型shortshort长整型长整型长整型长整型longlong整型整型整型整型intint本章所介绍的数本章所介绍的数本章所介绍的数本章所介绍的数据类型据类型据类型据类型2.1 常量与变量1. 标识符定义:用来标识变量、常量、函数等的字符序列组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划
4、线C语言的关键字不能用作变量名 大小写敏感长度:有效长度为32个字符。随系统而异,但至少前8个字符有效命名原则:变量名和函数名中的英文字母一般用小写,以增加可读性 见名知意不宜混淆 如l与I, o与0 在在在在TC2.0TC2.0TC2.0TC2.0及及及及BC3.1BC3.1BC3.1BC3.1中,变量名(标中,变量名(标中,变量名(标中,变量名(标识符)的有效长度为个字符,识符)的有效长度为个字符,识符)的有效长度为个字符,识符)的有效长度为个字符,缺省值为,但在缺省值为,但在缺省值为,但在缺省值为,但在VCVCVCVC中其长度可达中其长度可达中其长度可达中其长度可达到到到到255 255
5、 255 255 例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123M.D.John3days#33char$123ab . .字符非法字符非法字符非法字符非法 数字数字数字数字3 3 3 3不可作首字符不可作首字符不可作首字符不可作首字符 # #字符非法字符非法字符非法字符非法 charcharcharchar是关键字是关键字是关键字是关键字 字符非法字符非法字符非法字符非法 $ $ $ $不可作首字符不可作首字符不可作首字符不可作首字符2. 常量定义:程序
6、运行时其值不能改变的量(即常数) 常量的分类 :直接常量( 值常量) 整型常量: 10、15、-10、-30 实型常量: 12.5、 30.0、-1.5 字符常量: A、b、c 字符串常量: “sum”、“A”、“123”符号常量 用标识符来代表常量。 其定义格式为: # #define define define define 符号常量符号常量符号常量符号常量 常量常量常量常量 #define NUM 20 #define PI 3.1415926 #include #include #define PRICE 30#define PRICE 30void main ( )void main
7、 ( ) int num, total; int num, total; num = 10; num = 10; total = num * total = num * PRICEPRICE; ; printf (total = %d, total); printf (total = %d, total); 运行结果:运行结果:total = 300 行尾不能有分号行尾不能有分号行尾不能有分号行尾不能有分号 definedefinedefinedefine前面一定要有前面一定要有前面一定要有前面一定要有# # # # 符号常量名最好使用大写符号常量名最好使用大写符号常量名最好使用大写符号常量名
8、最好使用大写 符号常量名最好有意义符号常量名最好有意义符号常量名最好有意义符号常量名最好有意义 3. 变量定义:程序运行时其值可以被改变的量 变量的两要素 :变量名 、变量值变量的定义格式 :变量的初始化:定义时赋初始值变量的使用:先定义,后赋值变量定义位置:一般放在函数开头 存储类型存储类型存储类型存储类型 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1111,变量名,变量名,变量名,变量名2 2 2 2,变量名,变量名,变量名,变量名nnnn;int x, y, z;float radius, length, area; char ch;决定分配字节数和数的表示范围合法标识符
9、例: int a = 2, b, c = 4; float data = 3.67; char ch = A; int x = 1, y = 1, z = 1; int x = y = z = 1;例1: int student; stadent = 19; /Undefined symbol statent in function main 例2: float a,b,c; c = a % b; /Illegal use of floating point in function main void main ( ) int a, b = 2; float data; a = 1; data
10、 = (a + b) * 1.2; printf (“data=%fn”, data);变量定义可执行语句void main ( ) int a, b = 2; a = 1; float data; data = (a + b) * 1.2; printf(“data=%fn”,data);3.3 整型数据1. 整型整型常量常量常量常量 三种表示形式三种表示形式三种表示形式三种表示形式 l l 十进制整数:十进制整数:十进制整数:十进制整数:由数字由数字由数字由数字0 0 0 09 9 9 9和正负号表示和正负号表示和正负号表示和正负号表示 . . 如如如如:123,-456,0:123,-4
11、56,0:123,-456,0:123,-456,0l l八进制整数:由数字八进制整数:由数字八进制整数:由数字八进制整数:由数字0 0 0 0开头,后跟数字开头,后跟数字开头,后跟数字开头,后跟数字0 0 0 07 7 7 7表示表示表示表示. . . .如如如如:0123,011:0123,011:0123,011:0123,011l l十六进制整数:由十六进制整数:由十六进制整数:由十六进制整数:由0x0x0x0x或或或或0X0X0X0X开头开头开头开头, , , ,后跟后跟后跟后跟0 0 0 09,a9,a9,a9,af,Af,Af,Af,AF F F F表示表示表示表示. . . .
12、如如如如0x123,0Xff 0x123,0Xff 0x123,0Xff 0x123,0Xff 定义整数的符号常量定义整数的符号常量 #define NUM1 20 /#define NUM1 20 /十进制数十进制数2020 #define NUM2 020 / #define NUM2 020 /八进制数(十进制八进制数(十进制1616) #define NUM3 0x2a /#define NUM3 0x2a /十六进制数(十进制十六进制数(十进制4242)思考题:下列整型常量哪些是非法的?思考题:下列整型常量哪些是非法的? 012012,oX7AoX7A,0000,078078,0x5
13、Ac0x5Ac,-0xFFFF-0xFFFF,00340034,7B7B。首字符不能首字符不能是字母是字母o o 八进制数中不八进制数中不能有数字能有数字8 8 十进制数中不十进制数中不能有字母能有字母B B 2. 整型变量整型变量整型变量的定义整型变量的定义整型变量的定义整型变量的定义int int int int 变量名变量名变量名变量名 , 变量名变量名变量名变量名2 2 2 2,变量名,变量名,变量名,变量名nnnn;intintintint必须小写必须小写必须小写必须小写至少一个空格至少一个空格至少一个空格至少一个空格必须为合法的标识符必须为合法的标识符必须为合法的标识符必须为合法的
14、标识符以逗号以逗号以逗号以逗号, , , ,分隔分隔分隔分隔以分号以分号以分号以分号; ; ; ;结尾结尾结尾结尾定义时可以赋初值,方法:在变量名后面增加定义时可以赋初值,方法:在变量名后面增加定义时可以赋初值,方法:在变量名后面增加定义时可以赋初值,方法:在变量名后面增加“ “= = = = 数值数值数值数值” ” 例:例: int a; int x, y, z; int m = 2, y = -3;整型变量的分类整型变量的分类整型变量的分类整型变量的分类 基本整型:基本整型:基本整型:基本整型:intintintint 控制变量是否有符号:控制变量是否有符号:控制变量是否有符号:控制变量是
15、否有符号:signedsignedsignedsigned(有符号)和(有符号)和(有符号)和(有符号)和unsignedunsignedunsignedunsigned(无符号)(无符号)(无符号)(无符号) 控制整型变量的值域范围控制整型变量的值域范围控制整型变量的值域范围控制整型变量的值域范围 :shortshortshortshort(短)和(短)和(短)和(短)和longlonglonglong(长)。(长)。(长)。(长)。 有符号基本有符号基本有符号基本有符号基本整整整整型(型(型(型(intintintint 或或或或 signed intsigned intsigned in
16、tsigned int): 最高位为符号位,其它的为数据位最高位为符号位,其它的为数据位最高位为符号位,其它的为数据位最高位为符号位,其它的为数据位 无无无无符号基本型(符号基本型(符号基本型(符号基本型(unsinged unsinged unsinged unsinged 或或或或 unsinged unsinged unsinged unsinged intintintint): 都是数据位都是数据位都是数据位都是数据位不管是由符号还是无符号,整型不管是由符号还是无符号,整型不管是由符号还是无符号,整型不管是由符号还是无符号,整型占一个机器字大小的内存单元。占一个机器字大小的内存单元。占
17、一个机器字大小的内存单元。占一个机器字大小的内存单元。TCTC或或或或BC3.1BC3.1下下下下, ,整型整型整型整型变量占变量占变量占变量占2 2个字节(个字节(个字节(个字节(1616位)的内存单元位)的内存单元位)的内存单元位)的内存单元,所以对于有符号基本整型,其表示,所以对于有符号基本整型,其表示,所以对于有符号基本整型,其表示,所以对于有符号基本整型,其表示范围为(范围为(范围为(范围为(-2-21515221515-1-1), ,对于无符号基本整型,其表示范围为(对于无符号基本整型,其表示范围为(对于无符号基本整型,其表示范围为(对于无符号基本整型,其表示范围为(0202161
18、6-1-1);VC6.0VC6.0下,变量占下,变量占下,变量占下,变量占4 4个字节(个字节(个字节(个字节(3232位)的内存单元。位)的内存单元。位)的内存单元。位)的内存单元。 如果定义变量时,不指定如果定义变量时,不指定如果定义变量时,不指定如果定义变量时,不指定signedsignedsignedsigned,也不指定,也不指定,也不指定,也不指定unsignedunsignedunsignedunsigned,则默认为,则默认为,则默认为,则默认为signedsignedsignedsigned(有符号)(有符号)(有符号)(有符号) int a = 2; int a = 2;
19、unsigned unsigned intint b b = 2; = 2; 在内存中存储的形式为:在内存中存储的形式为:在内存中存储的形式为:在内存中存储的形式为: int a = -2; int a = -2; /定义一个无符号整型变量定义一个无符号整型变量定义一个无符号整型变量定义一个无符号整型变量a a a a,并赋初值,并赋初值,并赋初值,并赋初值-2-2-2-2 unsigned unsigned b b = -2; = -2; 在内存中的存储形式为:在内存中的存储形式为:在内存中的存储形式为:在内存中的存储形式为:00000000000000101111111111111110
20、对于对于对于对于a a而言,它的最高位是符号位,所以计算机在使用而言,它的最高位是符号位,所以计算机在使用而言,它的最高位是符号位,所以计算机在使用而言,它的最高位是符号位,所以计算机在使用a a时,先对时,先对时,先对时,先对a a的最高位的最高位的最高位的最高位进行判断,若最高位为进行判断,若最高位为进行判断,若最高位为进行判断,若最高位为1 1,表明该数为负数,计算机会对后面的,表明该数为负数,计算机会对后面的,表明该数为负数,计算机会对后面的,表明该数为负数,计算机会对后面的1515位进行取反位进行取反位进行取反位进行取反加加加加1 1操作,得到操作,得到操作,得到操作,得到a a的绝
21、对值;对于的绝对值;对于的绝对值;对于的绝对值;对于b b而言,它的而言,它的而言,它的而言,它的1616位均为数据位,所以位均为数据位,所以位均为数据位,所以位均为数据位,所以b b的值其的值其的值其的值其实等于实等于实等于实等于6553465534。 结论结论:对于有符号数也好还是无符号数也好,其实在计算机内存中表示是不对于有符号数也好还是无符号数也好,其实在计算机内存中表示是不加区分的,都是以其补码形式表示,只是我们怎样看待最高二进制位的问题,如加区分的,都是以其补码形式表示,只是我们怎样看待最高二进制位的问题,如果把最高位当成符号位看待,则为有符号数,如果把最高位当成数据位看待,则果把
22、最高位当成符号位看待,则为有符号数,如果把最高位当成数据位看待,则变为无符号数。变为无符号数。 有符号短整型(有符号短整型(有符号短整型(有符号短整型(short intshort intshort intshort int或或或或shortshortshortshort) short int a = 2; short int a = 2; /定义一个有符号短整型变量定义一个有符号短整型变量定义一个有符号短整型变量定义一个有符号短整型变量a a a a,并赋初值,并赋初值,并赋初值,并赋初值2 2 2 2 或或或或 short a = 2;short a = 2; 占用的内存单元为占用的内存单
23、元为占用的内存单元为占用的内存单元为2 2 2 2个字节,无论是个字节,无论是个字节,无论是个字节,无论是TCTCTCTC、BCBCBCBC,还是,还是,还是,还是VCVCVCVC。 无符号短整型(无符号短整型(无符号短整型(无符号短整型(unsigned short intunsigned short intunsigned short intunsigned short int或或或或unsigned shortunsigned shortunsigned shortunsigned short) unsigned short int a = 2; unsigned short int a
24、 = 2; /定义一个无符号短整型变量定义一个无符号短整型变量定义一个无符号短整型变量定义一个无符号短整型变量a a a a,并赋初值,并赋初值,并赋初值,并赋初值2 2 2 2 或或或或 unsigned short a = 2;unsigned short a = 2; 占用的内存单元字节数同占用的内存单元字节数同占用的内存单元字节数同占用的内存单元字节数同shortshortshortshort类型。类型。类型。类型。 在在在在TC2.0TC2.0TC2.0TC2.0和和和和BC3.1BC3.1BC3.1BC3.1下,下,下,下,unsigned shortunsigned shortu
25、nsigned shortunsigned short类型与类型与类型与类型与unsigned intunsigned intunsigned intunsigned int类型是等价的类型是等价的类型是等价的类型是等价的 。 有符号长整型(有符号长整型(有符号长整型(有符号长整型(long intlong intlong intlong int或或或或longlonglonglong) long int a = 234567; long int a = 234567; /定义一个有符号长整型变量定义一个有符号长整型变量定义一个有符号长整型变量定义一个有符号长整型变量a a a a,并赋初值,
26、并赋初值,并赋初值,并赋初值234567234567234567234567 或或或或 long a = 234567;long a = 234567; 占用的内存单元为占用的内存单元为占用的内存单元为占用的内存单元为4 4 4 4个字节,无论是个字节,无论是个字节,无论是个字节,无论是TCTCTCTC、BCBCBCBC,还是,还是,还是,还是VCVCVCVC。 无符号长整型(无符号长整型(无符号长整型(无符号长整型(unsigned long intunsigned long intunsigned long intunsigned long int或或或或unsigned longunsi
27、gned longunsigned longunsigned long) unsigned long int a = 2; unsigned long int a = 2; /定义一个无符号长整型变量定义一个无符号长整型变量定义一个无符号长整型变量定义一个无符号长整型变量a a a a,并赋初值,并赋初值,并赋初值,并赋初值2 2 2 2 或或或或 unsigned long a = 2;unsigned long a = 2; 占用的内存单元字节数同占用的内存单元字节数同占用的内存单元字节数同占用的内存单元字节数同longlonglonglong类型。类型。类型。类型。 在在在在VCVCVC
28、VC中中中中longlonglonglong与与与与intintintint类型基本相同,均占四个字节的内存单元;但在类型基本相同,均占四个字节的内存单元;但在类型基本相同,均占四个字节的内存单元;但在类型基本相同,均占四个字节的内存单元;但在TCTCTCTC或或或或BCBCBCBC中,中,中,中,longlonglonglong类型与类型与类型与类型与intintintint类型只是所占字节不同外(类型只是所占字节不同外(类型只是所占字节不同外(类型只是所占字节不同外(longlonglonglong占占占占4 4 4 4字节,字节,字节,字节,intintintint占占占占2 2 2 2
29、字节)字节)字节)字节),其它数据处理方法是一样的。,其它数据处理方法是一样的。,其它数据处理方法是一样的。,其它数据处理方法是一样的。 3. 浮点型浮点型数据数据 浮点浮点浮点浮点型常量(实数或浮点数)型常量(实数或浮点数)型常量(实数或浮点数)型常量(实数或浮点数) l l 十进制小数形式:十进制小数形式:十进制小数形式:十进制小数形式:由数字由数字由数字由数字0 0 0 09 9 9 9和小数点组成和小数点组成和小数点组成和小数点组成 . . 如如如如:0.0,5.6,-:0.0,5.6,-:0.0,5.6,-:0.0,5.6,-5.5.5.5.l l指数形式:由十进制数,加阶码标志指数
30、形式:由十进制数,加阶码标志指数形式:由十进制数,加阶码标志指数形式:由十进制数,加阶码标志e e e e或或或或E E E E以及阶码(只能为整以及阶码(只能为整以及阶码(只能为整以及阶码(只能为整数,可以带符号)组成数,可以带符号)组成数,可以带符号)组成数,可以带符号)组成. . . . 其一般形式为:其一般形式为:其一般形式为:其一般形式为:aEn aEn aEn aEn 其中:其中:其中:其中:a a a a为十进制数,为十进制数,为十进制数,为十进制数,n n n n为十进制整数,都不可缺少。其可表为十进制整数,都不可缺少。其可表为十进制整数,都不可缺少。其可表为十进制整数,都不可
31、缺少。其可表示为示为示为示为a a a a1010n n合法的实数表示:合法的实数表示:合法的实数表示:合法的实数表示: 2.1E5 2.1E5 2.1E5 2.1E5 表示表示表示表示2.12.12.12.1101010105 5 5 5,3.7E-2 3.7E-2 3.7E-2 3.7E-2 表示表示表示表示3.73.73.73.710101010-2-2-2-2。 非法的实数表示:非法的实数表示:非法的实数表示:非法的实数表示: 345345345345( ( ( (无小数点无小数点无小数点无小数点) ,E7E7E7E7( ( ( (阶码标志阶码标志阶码标志阶码标志E E E E之前无数
32、字之前无数字之前无数字之前无数字) ) ) ) , -5-5-5-5( ( ( (无阶码标志无阶码标志无阶码标志无阶码标志) ) ) ) ,50.-E350.-E350.-E350.-E3( ( ( (负号位置不对负号位置不对负号位置不对负号位置不对) ) ) ) 实型变量实型变量实型变量实型变量 l l 单精度实型(单精度实型(单精度实型(单精度实型(floatfloat) float f = 3.14, g;float f = 3.14, g; 这种定义的变量在内存中占这种定义的变量在内存中占这种定义的变量在内存中占这种定义的变量在内存中占4 4 4 4个字节(个字节(个字节(个字节(32
33、323232位)的存储单元。位)的存储单元。位)的存储单元。位)的存储单元。l l双精度实型双精度实型双精度实型双精度实型(doubledouble) double x, y;double x, y; 这种定义的变量在内存中占这种定义的变量在内存中占这种定义的变量在内存中占这种定义的变量在内存中占8 8 8 8个字节(个字节(个字节(个字节(64646464位)的存储单元。位)的存储单元。位)的存储单元。位)的存储单元。 l l长双精度实型长双精度实型长双精度实型长双精度实型(long doublelong double) long double x, y;long double x, y;
34、在在在在TCTCTCTC或或或或BCBCBCBC下,这种定义的变量在内存中占下,这种定义的变量在内存中占下,这种定义的变量在内存中占下,这种定义的变量在内存中占10101010个字节(个字节(个字节(个字节(80808080位)位)位)位)的存储单元;在的存储单元;在的存储单元;在的存储单元;在VCVCVCVC下则占下则占下则占下则占8 8 8 8个字节(个字节(个字节(个字节(64646464位)。位)。位)。位)。 6. 字符型数据和字符串常量字符型数据和字符串常量 字符型常量字符型常量字符型常量字符型常量 l l 定义:定义:定义:定义:用用用用单引号单引号单引号单引号括起来的单个括起来
35、的单个括起来的单个括起来的单个普通字符普通字符普通字符普通字符或或或或转义字符转义字符转义字符转义字符. . . . 如 a A ? n 101l l 字符常量的值:字符常量的值:字符常量的值:字符常量的值:该字符的该字符的该字符的该字符的ASCIIASCIIASCIIASCII码码码码值值值值如 A65, a97, 048 , n10l l 转义字符转义字符转义字符转义字符: : : :反斜线后面跟一个字符或一个代码值表示反斜线后面跟一个字符或一个代码值表示反斜线后面跟一个字符或一个代码值表示反斜线后面跟一个字符或一个代码值表示转义字符及其含义:转义字符转义字符含义含义nvradddtbf“
36、xhh转义字符转义字符含义含义换行垂直制表回车响铃单引号3位8进制数代表的字符水平制表退格换页反斜线双引号2位16进制数代表的字符如 101 -A 012 -n 376 - x61 -a 60 -0 483 -()例:A-101-x41-65字符型变量l 字符型数据类型符是char(字符character)l 在内存中占1个字节(8位) l 字符变量存放字符ASCII码l char与int数据间可进行算术运算l 存在有符号和无符号之分。默认情况下为有符号 例:例:例:例: char ch;char ch; unsigned char C = B; unsigned char C = B;例:例
37、:例:例: a = D; a = D; / a = 68;/ a = 68; x = A + 5; x = A + 5; / x = 65 + 5;/ x = 65 + 5; s = ! + G s = ! + G / s = 33 + 71;/ s = 33 + 71; 字符串常量l 定义:用双引号(“”)括起来的字符序列l l 存储:每个字符串尾自动加一个 0 作为字符串结束标志0x41 0x41 0例例例例 A A A A “ “A”A”例: char ch; ch = “A”; 例: char ch; ch = A; 例: “hello”,“123”,ab1.56 l 字符常量与字符串
38、常量不同3.4 C语言的运算符与表达式 变量用来存放数据,运算符则用来处理数据。用运算符变量用来存放数据,运算符则用来处理数据。用运算符变量用来存放数据,运算符则用来处理数据。用运算符变量用来存放数据,运算符则用来处理数据。用运算符将变量和常量连接起来的符合将变量和常量连接起来的符合将变量和常量连接起来的符合将变量和常量连接起来的符合C C C C语法规则的式子被称为语法规则的式子被称为语法规则的式子被称为语法规则的式子被称为表达式。表达式。表达式。表达式。 运算符的分类:运算符的分类:运算符的分类:运算符的分类: 单目运算符:只带一个操作数的运算符。如:单目运算符:只带一个操作数的运算符。如
39、:单目运算符:只带一个操作数的运算符。如:单目运算符:只带一个操作数的运算符。如:+、-运算符。运算符。运算符。运算符。 双目运算符:带两个操作数的运算符。如:双目运算符:带两个操作数的运算符。如:双目运算符:带两个操作数的运算符。如:双目运算符:带两个操作数的运算符。如:+ + + +、- - - -运算符。运算符。运算符。运算符。 三目运算符:带三个操作数的运算符。如:三目运算符:带三个操作数的运算符。如:三目运算符:带三个操作数的运算符。如:三目运算符:带三个操作数的运算符。如:? ? ? ?运算符。运算符。运算符。运算符。 学习运算符时应注意:学习运算符时应注意:学习运算符时应注意:学
40、习运算符时应注意: 运算符的功能:该运算符主要用于做什么运算。运算符的功能:该运算符主要用于做什么运算。运算符的功能:该运算符主要用于做什么运算。运算符的功能:该运算符主要用于做什么运算。与运算量关系:要求运算量的个数及运算量的类型。与运算量关系:要求运算量的个数及运算量的类型。与运算量关系:要求运算量的个数及运算量的类型。与运算量关系:要求运算量的个数及运算量的类型。运算符的优先级:表达式中包含多个不同运算符时运算符运算的先运算符的优先级:表达式中包含多个不同运算符时运算符运算的先运算符的优先级:表达式中包含多个不同运算符时运算符运算的先运算符的优先级:表达式中包含多个不同运算符时运算符运算
41、的先后次序。后次序。后次序。后次序。运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结合性)。合性)。合性)。合性)。运算结果的类型:表达式运算后最终所得到的值的类型。运算结果的类型:表达式运算后最终所得到的值的类型。运算结果的类型:表达式运算后最终所得到的值的类型。运算结果的类型:表达式运算后最终所得到的值的类型。C运运算算符符算术运算符:(算术运算符:(+ - * / % + -+ - * / % + -)关系
42、运算符:(关系运算符:( = != = !=)逻辑运算符:(!逻辑运算符:(! & |& |)位运算符位运算符 :(:( )赋值运算符:(赋值运算符:(= = 及其扩展)及其扩展)条件运算符:(条件运算符:(?:?:)逗号运算符:(逗号运算符:(, ,)指针运算符:(指针运算符:(* * & &)求字节数求字节数 :(:(sizeofsizeof)强制类型转换:(类型)强制类型转换:(类型)分量运算符:(分量运算符:(. -. -)下标运算符:(下标运算符:()其它其它 :(:(( ) -( ) -)1. 赋值运算符、赋值表达式 赋值运算符赋值运算符赋值运算符赋值运算符(“ “” ”,双目运算
43、符),双目运算符),双目运算符),双目运算符) l l 一般形式:一般形式:一般形式:一般形式:变量变量变量变量 = = = = 常量或变量或表达式常量或变量或表达式常量或变量或表达式常量或变量或表达式l l 功能:功能:功能:功能:将右边常量或变量或表达式的值赋给左边变量将右边常量或变量或表达式的值赋给左边变量将右边常量或变量或表达式的值赋给左边变量将右边常量或变量或表达式的值赋给左边变量 例如:例如:例如:例如: int x, y, z;int x, y, z; x = 20; x = 20; y = x; y = x; z = x + y; z = x + y;赋值表达式赋值表达式赋值表
44、达式赋值表达式 l l 定义:定义:定义:定义: 由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一个表达式连接起来的表达式,称为个表达式连接起来的表达式,称为个表达式连接起来的表达式,称为个表达式连接起来的表达式,称为赋值表达式赋值表达式赋值表达式赋值表达式。l l 一般格式:一般格式:一般格式:一般格式:变量变量变量变量 (复合)赋值运算符(复合)赋值运算符(复合)赋值运算符(复合)赋值运算符 表达式表
45、达式表达式表达式l l 赋值表达式的值:赋值表达式的值:赋值表达式的值:赋值表达式的值:被赋值变量的值。被赋值变量的值。被赋值变量的值。被赋值变量的值。例如:例如:例如:例如:“ “a = 5a = 5a = 5a = 5” ”这个赋值表达式,变量这个赋值表达式,变量这个赋值表达式,变量这个赋值表达式,变量a a a a的值的值的值的值“ “” ”就是它的值。就是它的值。就是它的值。就是它的值。 赋值语句赋值语句赋值语句赋值语句 例如:例如:例如:例如: x = 8; a = b = c = 5x = 8; a = b = c = 5; l l 定义:定义:定义:定义:赋值表达式在其后面加分号
46、就构成了赋值表达式在其后面加分号就构成了赋值表达式在其后面加分号就构成了赋值表达式在其后面加分号就构成了赋值语句赋值语句赋值语句赋值语句。 赋值运算符及赋值表达式的使用赋值运算符及赋值表达式的使用赋值运算符及赋值表达式的使用赋值运算符及赋值表达式的使用 l l 多个变量连续赋值多个变量连续赋值多个变量连续赋值多个变量连续赋值例如:例如:例如:例如: a = b = c = 10a = b = c = 10; a = (b = (c = 10)a = (b = (c = 10); 结果:结果:结果:结果:a a、b b、c c的值都为的值都为的值都为的值都为1010l l 赋值表达式的嵌套赋值表
47、达式的嵌套赋值表达式的嵌套赋值表达式的嵌套例如:例如:例如:例如: a = (b = 2) + (c = 3)a = (b = 2) + (c = 3) ( a = (b = 2) + (c = 3)( a = (b = 2) + (c = 3) 结果:结果:结果:结果:b b为为为为2 2,c c为为为为3 3,a a为为为为b+cb+c即即即即5 5注意:注意:注意:注意: 赋值语句赋值语句赋值语句赋值语句“ “= = = =” ”左边必须是变量名或对应某特定内存左边必须是变量名或对应某特定内存左边必须是变量名或对应某特定内存左边必须是变量名或对应某特定内存单元的表达式单元的表达式单元的表
48、达式单元的表达式(后面的章节会遇到这样的表达式),不(后面的章节会遇到这样的表达式),不(后面的章节会遇到这样的表达式),不(后面的章节会遇到这样的表达式),不能是常量或其它表达式。能是常量或其它表达式。能是常量或其它表达式。能是常量或其它表达式。 例如:例如:例如:例如:30 = a; b + 2 = 5; 30 = a; b + 2 = 5; 30 = a; b + 2 = 5; 30 = a; b + 2 = 5; 都是错误的。都是错误的。都是错误的。都是错误的。 赋值语句中的赋值语句中的赋值语句中的赋值语句中的“ “= = = =” ”表示赋值,不是代数中相等的意表示赋值,不是代数中相
49、等的意表示赋值,不是代数中相等的意表示赋值,不是代数中相等的意思。思。思。思。要表示相等的意思则应用关系运算符要表示相等的意思则应用关系运算符要表示相等的意思则应用关系运算符要表示相等的意思则应用关系运算符“ “=” ”表示,表示,表示,表示,二者切勿混淆!二者切勿混淆!二者切勿混淆!二者切勿混淆!2. 强制类型转换符 C C C C语言的数据类型是可以相互转换的。转换的方法有两语言的数据类型是可以相互转换的。转换的方法有两语言的数据类型是可以相互转换的。转换的方法有两语言的数据类型是可以相互转换的。转换的方法有两种:一种是种:一种是种:一种是种:一种是自动转换自动转换自动转换自动转换,一种是
50、,一种是,一种是,一种是强制转换强制转换强制转换强制转换。自动转换自动转换自动转换自动转换 例如:例如:例如:例如:int a = 2.5; int a = 2.5; int a = 2.5; int a = 2.5; 则则则则a a a a的值将是的值将是的值将是的值将是2,2,2,2,而而而而不是不是不是不是2.52.52.52.5。 这种自动改变等号右边表达式值的数据类型的操作称这种自动改变等号右边表达式值的数据类型的操作称这种自动改变等号右边表达式值的数据类型的操作称这种自动改变等号右边表达式值的数据类型的操作称为数据类型的为数据类型的为数据类型的为数据类型的自动转换。自动转换。自动转
51、换。自动转换。 首先将等号右边的表达式的值转换首先将等号右边的表达式的值转换首先将等号右边的表达式的值转换首先将等号右边的表达式的值转换成成成成“ “= = = =” ”左边的数据类型。然后再赋值给左边的数据类型。然后再赋值给左边的数据类型。然后再赋值给左边的数据类型。然后再赋值给等号左边的变量等号左边的变量等号左边的变量等号左边的变量。 (1) (1) (1) (1) 短长度的数据类型短长度的数据类型短长度的数据类型短长度的数据类型 长长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型 方法:方法:方法:方法:直接将无符号短长度的数据类型的数据作为长长度的数据直接将无符号短长度的
52、数据类型的数据作为长长度的数据直接将无符号短长度的数据类型的数据作为长长度的数据直接将无符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,长长度的数据类型数据的高位部分补零。类型数据的低位部分,长长度的数据类型数据的高位部分补零。类型数据的低位部分,长长度的数据类型数据的高位部分补零。类型数据的低位部分,长长度的数据类型数据的高位部分补零。 l l无符号短长度的数据类型无符号短长度的数据类型无符号短长度的数据类型无符号短长度的数据类型 无符号或有符号长长度的数据类型无符号或有符号长长度的数据类型无符号或有符号长长度的数据类型无符号或有符号长长度的数据类型xxxxxx无符号短长度的数
53、据类型无符号短长度的数据类型无符号短长度的数据类型无符号短长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型xxxxxx0 00 0. . . . . .0 0. . . . . . .高位部分补高位部分补高位部分补高位部分补0 0 0 0例如:例如:例如:例如: unsigned char ch = 0xfc;unsigned char ch = 0xfc; unsigned int a = 0xff00; unsigned int a = 0xff00; /假设假设intint数据为数据为1616位位 int b;int b; unsigned long u;
54、unsigned long u; b = ch;b = ch; /b/b的值将是的值将是0x00fc0x00fc u = a; u = a; /u/u的值将是的值将是0x0000ff000x0000ff002. 强制类型转换符 自动转换自动转换自动转换自动转换 (1) (1) (1) (1) 短长度的数据类型短长度的数据类型短长度的数据类型短长度的数据类型 长长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型 方法:方法:方法:方法:直接将有符号短长度的数据类型的数据作为长长度的数据直接将有符号短长度的数据类型的数据作为长长度的数据直接将有符号短长度的数据类型的数据作为长长度的数据
55、直接将有符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据的符号位)向长长度的数据类型数据的高位部分扩展。的符号位)向长长度的数据类型数据的高位部分扩展。的符号位)向长长度的数据类型数据的高位部分扩展。的符号位)向长长度的数据类型数据的高位部分扩展。 l l有符号短长度的数据类型有符号短长度的数据类型有符号短长度的数据类型有符号短长度的数据类型 无符号或有符
56、号长长度的数据类型无符号或有符号长长度的数据类型无符号或有符号长长度的数据类型无符号或有符号长长度的数据类型z zxxxx有符号短长度的数据类型有符号短长度的数据类型有符号短长度的数据类型有符号短长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型z zxxxxz z符号位向高位符号位向高位符号位向高位符号位向高位部分扩展部分扩展部分扩展部分扩展z zz z符号位符号位符号位符号位例如:例如:例如:例如: char ch = 2; char ch = 2; int a = -2; int a = -2; int b; int b; unsigned long u; u
57、nsigned long u; b = ch; b = ch; /b/b的值将是的值将是2 2 u = a;u = a; /u/u的值将是的值将是0xfffffffe0xfffffffe2. 强制类型转换符 自动转换自动转换自动转换自动转换 (2) (2) (2) (2) 长长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型 短长度的数据类型短长度的数据类型短长度的数据类型短长度的数据类型 方法:方法:方法:方法:直接截取长长度的数据类型数据的低位部分(长度为短长直接截取长长度的数据类型数据的低位部分(长度为短长直接截取长长度的数据类型数据的低位部分(长度为短长直接截取长长度的数据
58、类型数据的低位部分(长度为短长度的数据类型的长度)作为短长度数据类型的数据。度的数据类型的长度)作为短长度数据类型的数据。度的数据类型的长度)作为短长度数据类型的数据。度的数据类型的长度)作为短长度数据类型的数据。 xxxxxx短长度的数据类型短长度的数据类型短长度的数据类型短长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型长长度的数据类型yyyyyyxxxxxx例如:例如:例如:例如: int a = -32768; int a = -32768; /假设假设intint数据为数据为1616位位 unsigned long b = 0xffffaa00;unsigned lon
59、g b = 0xffffaa00; char ch; char ch; int c; int c; ch = a; ch = a; /ch/ch的值将是的值将是0 0 c = b; c = b; /c/c的值将是的值将是0xaa000xaa00(3) (3) (3) (3) 长度相同的数据类型转换长度相同的数据类型转换长度相同的数据类型转换长度相同的数据类型转换 方法:方法:方法:方法:数据按照原样复制即可。数据按照原样复制即可。数据按照原样复制即可。数据按照原样复制即可。 例如:例如:例如:例如: int a = 0xff00;int a = 0xff00; unsigned int b =
60、 a;unsigned int b = a; /b/b的值将是的值将是0xff000xff002. 强制类型转换符 强制转换强制转换强制转换强制转换 强制类型转换是通过类型转换运算来实现的。其一般强制类型转换是通过类型转换运算来实现的。其一般强制类型转换是通过类型转换运算来实现的。其一般强制类型转换是通过类型转换运算来实现的。其一般形式为:形式为:形式为:形式为: ( ( ( (类型说明符类型说明符类型说明符类型说明符) () () () (表达式表达式表达式表达式) ) ) ) 功能:功能:功能:功能:把表达式的运算结果强制转换成类型说明符所把表达式的运算结果强制转换成类型说明符所把表达式的
61、运算结果强制转换成类型说明符所把表达式的运算结果强制转换成类型说明符所表示的类型。其中,表示的类型。其中,表示的类型。其中,表示的类型。其中,( ( ( (类型说明符类型说明符类型说明符类型说明符) ) ) )是强制类型转换符,它是强制类型转换符,它是强制类型转换符,它是强制类型转换符,它的优先级比较高。的优先级比较高。的优先级比较高。的优先级比较高。 例:例:例:例: float x = 3.5, y = 2.1, z; float x = 3.5, y = 2.1, z; int a; int a; a = (int)(x+y); a = (int)(x+y); /结果为结果为5 5 z
62、= (int)x+y; z = (int)x+y; /结果为结果为5.1000005.100000 z = (double)(3/2); z = (double)(3/2); /结果为结果为1.0000001.000000 a = (int)3.6; a = (int)3.6; /结果为结果为3 3精度损失问题精度损失问题精度损失问题精度损失问题较高类型向较低较高类型向较低较高类型向较低较高类型向较低类型转换时可能类型转换时可能类型转换时可能类型转换时可能发生发生发生发生注意:在使用强制转换时应注意以下问题:注意:在使用强制转换时应注意以下问题:注意:在使用强制转换时应注意以下问题:注意:在使
63、用强制转换时应注意以下问题:类型说明符和表达式都必须加括号类型说明符和表达式都必须加括号类型说明符和表达式都必须加括号类型说明符和表达式都必须加括号( ( ( (单个变量可以不加括号单个变量可以不加括号单个变量可以不加括号单个变量可以不加括号) ) ) )。 例如:把例如:把例如:把例如:把(int)(x+y)(int)(x+y)(int)(x+y)(int)(x+y)写成写成写成写成(int)x+y(int)x+y(int)x+y(int)x+y则成了把则成了把则成了把则成了把x x x x转换成转换成转换成转换成intintintint型之后再型之后再型之后再型之后再与与与与y y y y
64、相加了。相加了。相加了。相加了。无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。型。型。型。 例如,例如,例如,例如,(double)a (double)a
65、 (double)a (double)a 只是将变量只是将变量只是将变量只是将变量a a a a的值转换成一个的值转换成一个的值转换成一个的值转换成一个doubledoubledoubledouble型的中间量,型的中间量,型的中间量,型的中间量,其数据类型并未转换成其数据类型并未转换成其数据类型并未转换成其数据类型并未转换成doubledoubledoubledouble型。型。型。型。 基本算术运算符: + - * / %l 结合方向:从左向右l 优先级: - -* / % - + - (2) (3) (4)说明:l “-”可为单目运算符时,右结合性l 两整数相除,结果为整数l %要求两侧
66、均为整型数据例:例:例:例: 5 / 2 =5 / 2 = -5 / 2.0 = -5 / 2.0 =例:例:例:例: 5 % 2 =5 % 2 = -5 % 2 = -5 % 2 = 1 % 10 = 1 % 10 = 5 % 1 =5 % 1 = 5.5 % 2 5.5 % 2 3. 算术运算符、算术表达式 2 2-2.5-2.51 1-1-11 10 0( ( ) ) 表达式和算术表达式3. 算术运算符、算术表达式 表达式:表达式:表达式:表达式:用运算符和括号将运算对象(常量、变量和函数用运算符和括号将运算对象(常量、变量和函数用运算符和括号将运算对象(常量、变量和函数用运算符和括号将
67、运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子。等)连接起来的、符合语言语法规则的式子。等)连接起来的、符合语言语法规则的式子。等)连接起来的、符合语言语法规则的式子。 算术表达式:算术表达式:算术表达式:算术表达式:表达式中的运算符都是算术运算符的表达式。表达式中的运算符都是算术运算符的表达式。表达式中的运算符都是算术运算符的表达式。表达式中的运算符都是算术运算符的表达式。 运算符优先级(到目前为止)例:例:例:例: 3 + 5 * 83 + 5 * 8、(x + y) / 2 - 1(x + y) / 2 - 1等等等等类型强制转换运算符的优先级类型强制转换运算符的优先级
68、类型强制转换运算符的优先级类型强制转换运算符的优先级 算术运算符的优先级算术运算符的优先级算术运算符的优先级算术运算符的优先级赋值运算符的优先级赋值运算符的优先级赋值运算符的优先级赋值运算符的优先级 自增、自减运算符+ -l 作用:使变量值加1或减1l 种类: 前置 +i, -i (先执行i=i+1或i=i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i=i+1或i=i-1)例:例:例:例: j = 3; k = +j; j = 3; k = +j; j = 3; k = j+; j = 3; k = j+; j = 3; printf (“%d”, +j); j = 3; pri
69、ntf (“%d”, +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; 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=44. 自增自减运算符、符号运算符 负号运算符(“-”) 减号()既是一个算术运算符,又是一个
70、负号运算符。负号运算符是单目运算符。例如:a = 2,那么a的值就是2。负号运算符的优先级比较高,与强制类型转换符是同一个级别。 自增、自减运算符注意事项+和-运算符只能用于变量,不能用于常量和表达式。 因为+和-蕴含着赋值操作。 例如:5+、-(a+b)都是非法的表达式。负号运算符、+、-和强制类型转换运算符的优先级相同,当这些运算符连用时,按照从右向左的顺序计算,即具有右结合性。两个和之间不能有空格。在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。 例如:+i+是非法的。自增、自减运算,常用于循环语句中,使循环控制变变量加(或减)-,以及指针变量中,使指针
71、指向下(或上)一个地址。4. 自增自减运算符、符号运算符例:例:例:例: int p, i = 2, j = 3;int p, i = 2, j = 3; p = -i+; p = -i+; p = ? i = ?p = ? i = ? p = i+j; p = i+j; p = ? i = ? j = ?p = ? i = ? j = ? p = i+-j; p = i+-j; p = ? i = ? j = ?p = ? i = ? j = ? p = i+-j; p = i+-j; p = ? i = ? j = ?p = ? i = ? j = ? p = i+i+; p = i+i+
72、; p = ? i = ? p = ? i = ? p = +i+(+i); p = +i+(+i); p = ? i = ? p = ? i = ? -2-23 35 53 33 34 42 22 24 43 32 24 44 48 84 45. 算术运算符中数据类型转换规则 低低低低高高高高doubledoublefloatfloatlonglongunsignedunsignedintintchar, shortchar, shortlong dlong doubleouble说明说明说明说明: : : :必定的转换必定的转换必定的转换必定的转换运算对象类型不同时转换运算对象类型不同时转
73、换运算对象类型不同时转换运算对象类型不同时转换例:例:例:例: char ch;char ch; int i; int i; float f; float f; double d; double d;ch/i + f*d - (f+i)ch/i + f*d - (f+i)intintintintdoubledoubledoubledoubledoubledoubledoubledoubledoubledoubledoubledouble10+a +i*f - d/l10+a +i*f - d/l例:例:例:例: int i;int i; float f; float f; double d;
74、double d; long l; long l;intintintintdoubledoubledoubledoubledoubledoubledoubledoubledoubledoubledoubledouble#include #include void main ( )void main ( ) float a, b, c; float a, b, c; a = 7 / 2; a = 7 / 2; /计算计算计算计算7/27/27/27/2得得得得intintintint型值型值型值型值3 3 3 3,因此,因此,因此,因此a a a a的值为的值为的值为的值为3.03.03.03.
75、0 b = 7 / 2 * 1.0; b = 7 / 2 * 1.0; /计算计算计算计算7/27/27/27/2得得得得intintintint型值型值型值型值3 3 3 3,再与,再与,再与,再与1.01.01.01.0相乘,因此相乘,因此相乘,因此相乘,因此b b b b的值为的值为的值为的值为3.03.03.03.0 c = 1.0 * 7 / 2; c = 1.0 * 7 / 2; /先计算先计算先计算先计算1.0*71.0*71.0*71.0*7得得得得doubledoubledoubledouble型的结果型的结果型的结果型的结果7.07.07.07.0,然后再计算,然后再计算,
76、然后再计算,然后再计算 7.0/27.0/27.0/27.0/2,因此,因此,因此,因此c c c c的值是的值是的值是的值是3.53.53.53.5 printf (a = %f, b = %f, c = %f, a, b, c); printf (a = %f, b = %f, c = %f, a, b, c); a = 3.000000a = 3.000000,b = 3.000000b = 3.000000,c = 3.500000c = 3.5000006. 位运算符、位运算表达式 位运算符:位运算符:位运算符:位运算符:按位与(按位与(按位与(按位与(& & & &)、按位或()、
77、按位或()、按位或()、按位或(| | | |)、按位取反)、按位取反)、按位取反)、按位取反( )、按位异或()、按位异或()、按位异或()、按位异或( )、左移()、左移()、左移()、左移()六种。)六种。)六种。)六种。 左移(左移(左移(左移() 实现将某变量所对应的二进制数往左移位,溢出的最实现将某变量所对应的二进制数往左移位,溢出的最实现将某变量所对应的二进制数往左移位,溢出的最实现将某变量所对应的二进制数往左移位,溢出的最高位被丢掉,空出的低位用零填补。其一般格式为:高位被丢掉,空出的低位用零填补。其一般格式为:高位被丢掉,空出的低位用零填补。其一般格式为:高位被丢掉,空出的低
78、位用零填补。其一般格式为: 返回整型值的表达式返回整型值的表达式返回整型值的表达式返回整型值的表达式 返回整型值的表达式返回整型值的表达式返回整型值的表达式返回整型值的表达式例:例:例:例: int a = 3;int a = 3; a 2a 2:将将将将a a a a所对应的二进制数左移两位,该表达式的所对应的二进制数左移两位,该表达式的所对应的二进制数左移两位,该表达式的所对应的二进制数左移两位,该表达式的值为值为值为值为12121212。 2 a2 ) 右移运算实现将某变量所对应的二进制数往右移位,右移运算实现将某变量所对应的二进制数往右移位,右移运算实现将某变量所对应的二进制数往右移位
79、,右移运算实现将某变量所对应的二进制数往右移位,溢出的最低位被丢掉,如果变量是无符号数,空出的高位溢出的最低位被丢掉,如果变量是无符号数,空出的高位溢出的最低位被丢掉,如果变量是无符号数,空出的高位溢出的最低位被丢掉,如果变量是无符号数,空出的高位用零填补,如果变量是有符号数,空出的高位用原来的符用零填补,如果变量是有符号数,空出的高位用原来的符用零填补,如果变量是有符号数,空出的高位用原来的符用零填补,如果变量是有符号数,空出的高位用原来的符号位填补(即负数填号位填补(即负数填号位填补(即负数填号位填补(即负数填1 1 1 1,正数填,正数填,正数填,正数填0 0 0 0)。其一般格式为:)
80、。其一般格式为:)。其一般格式为:)。其一般格式为: 返回整型值的表达式返回整型值的表达式返回整型值的表达式返回整型值的表达式 返回整型值的表达式返回整型值的表达式返回整型值的表达式返回整型值的表达式例:例:例:例:int a = 8; int a = 8; a 2 a 2:将将将将a a a a所对应的二进制数右移两位,该表达式的值为所对应的二进制数右移两位,该表达式的值为所对应的二进制数右移两位,该表达式的值为所对应的二进制数右移两位,该表达式的值为2 2 2 2。 例:例:例:例: 将将将将shortshortshortshort类型数据的高、低位字节互换类型数据的高、低位字节互换类型数
81、据的高、低位字节互换类型数据的高、低位字节互换 #include #include void main ( )void main ( ) short a = 0xf245 , b, c; short a = 0xf245 , b, c; b = a 8 ; b = a 8 ; c = a 8 ; /将将将将a a a a的高的高的高的高8 8 8 8位移到低位移到低位移到低位移到低8 8 8 8位赋值给位赋值给位赋值给位赋值给c c c c,c c c c的值为的值为的值为的值为0xfff20xfff20xfff20xfff2 c = c & 0x00ff; c = c & 0x00ff; /
82、将将将将c c c c的高的高的高的高8 8 8 8位清位清位清位清0 0 0 0后赋值给后赋值给后赋值给后赋值给c c c c,c c c c的值为的值为的值为的值为0x00f20x00f20x00f20x00f2 a = b + c; a = b + c; /将将将将b b b b和和和和c c c c的值相加赋值给的值相加赋值给的值相加赋值给的值相加赋值给a a a a,a a a a的值为的值为的值为的值为0x45f20x45f20x45f20x45f2 printf (a = %x, a); printf (a = %x, a); a = 0x45f2a = 0x45f2 位运算之间
83、的优先级位运算之间的优先级位运算之间的优先级位运算之间的优先级 & | & |7. 逗号运算符、逗号表达式 位运算符:位运算符:位运算符:位运算符:, , , , 逗号表达式:逗号表达式:逗号表达式:逗号表达式:用逗号连接起来的表达式。其一般形式为:用逗号连接起来的表达式。其一般形式为:用逗号连接起来的表达式。其一般形式为:用逗号连接起来的表达式。其一般形式为: 表达式表达式表达式表达式1 1 1 1,表达式,表达式,表达式,表达式2 2 2 2,表达式,表达式,表达式,表达式k k k k 优先级:优先级:优先级:优先级:优先级最低。优先级最低。优先级最低。优先级最低。 结合性:结合性:结合
84、性:结合性:左结合性左结合性左结合性左结合性 。即逗号表达式的求值顺序是即逗号表达式的求值顺序是即逗号表达式的求值顺序是即逗号表达式的求值顺序是从左向从左向从左向从左向右右右右依此计算用逗号分隔的各表达式的值。依此计算用逗号分隔的各表达式的值。依此计算用逗号分隔的各表达式的值。依此计算用逗号分隔的各表达式的值。 逗号表达式逗号表达式逗号表达式逗号表达式的值:的值:的值:的值:最后一个表达式的值就是整个逗号表达最后一个表达式的值就是整个逗号表达最后一个表达式的值就是整个逗号表达最后一个表达式的值就是整个逗号表达式的值。式的值。式的值。式的值。 用途:用途:用途:用途:常用于循环常用于循环常用于循
85、环常用于循环forforforfor语句中语句中语句中语句中。例如:例如:例如:例如:a+3, b=4, b+a+3, b=4, b+ 例例例例: : a = 3 * 5, a * 4 a = 3 * 5, a * 4 a = 3 * 5, a * 4, a + 5 a = 3 * 5, a * 4, a + 5例例例例: : : : x = (a = 3, 6 * 3)x = (a = 3, 6 * 3) x = a = 3, 6 * a x = a = 3, 6 * a例:例:例:例:a = 1; b = 2; c = 3;a = 1; b = 2; c = 3; printf (“%d,
86、%d,%d”, a, b, c); printf (“%d,%d,%d”, a, b, c); printf (“%d,%d,%d”, (a, b, c), b, c); printf (“%d,%d,%d”, (a, b, c), b, c); /a=15,/a=15,表达式值表达式值6060/a=15,/a=15,表达式值表达式值2020/赋值表达式,表达式值赋值表达式,表达式值1818,x=18x=18/逗号表达式逗号表达式, ,表达式值表达式值18,18,x=3x=3/1,2,3/1,2,3/3,2,3/3,2,3例例例例: : : :#include #include vovoid
87、main ( )id main ( ) int x, y = 7; int x, y = 7; float z = 4; float z = 4; x = (y = y + 6, y / z); x = (y = y + 6, y / z); printf (x = %dn, x); printf (x = %dn, x); 运行结果:运行结果:运行结果:运行结果:x = 3x = 38. sizeof运算符、复合运算符 sizeofsizeofsizeofsizeof运算符运算符运算符运算符 功能:功能:功能:功能:获取变量和数据类型所占内存大小(字节数)获取变量和数据类型所占内存大小(字节
88、数)获取变量和数据类型所占内存大小(字节数)获取变量和数据类型所占内存大小(字节数) 格式:格式:格式:格式:sizeof sizeof sizeof sizeof 表达式表达式表达式表达式sizeofsizeofsizeofsizeof(数据类型名或表达式)(数据类型名或表达式)(数据类型名或表达式)(数据类型名或表达式)例:例:例:例: sizeof (int) sizeof (int) 其值为其值为其值为其值为2 2 2 2(在(在(在(在TC2.0TC2.0TC2.0TC2.0或或或或BC3.1BC3.1BC3.1BC3.1下)下)下)下) 其值为其值为其值为其值为4 4 4 4(在在
89、在在VC6.0VC6.0VC6.0VC6.0下)下)下)下) sizeof (long) sizeof (long) 其值是其值是其值是其值是4 4 4 4 sizeof 10L 其值也是其值也是4 4 unsigned long a = 2; sizeof (a) 其值也是其值也是4 4 复合赋值运算符复合赋值运算符复合赋值运算符复合赋值运算符 种类:种类:种类:种类: += -= *= /= %=+= -= *= /= %= = &= = |= = &= = |=含义:含义:含义:含义: exp1 op= exp2exp1 op= exp2 exp1 = exp1 op exp2exp1
90、= exp1 op exp2 定义:定义:定义:定义:将算术运算符、位运算符与赋值运算符组合在将算术运算符、位运算符与赋值运算符组合在将算术运算符、位运算符与赋值运算符组合在将算术运算符、位运算符与赋值运算符组合在一起就构成了一起就构成了一起就构成了一起就构成了复合赋值运算符复合赋值运算符复合赋值运算符复合赋值运算符。复合赋值运算符即包含了。复合赋值运算符即包含了。复合赋值运算符即包含了。复合赋值运算符即包含了算术运算或位运算,又包含了赋值操作。算术运算或位运算,又包含了赋值操作。算术运算或位运算,又包含了赋值操作。算术运算或位运算,又包含了赋值操作。a += 3a += 3a = a + 3
91、a = a + 3x *= y + 8x *= y + 8x = x * (y + 8)x = x * (y + 8)x %= 3x %= 3x = x % 3x = x % 3x &= y = 3x &= y = 3y = y = 3 3 和和和和 x &= yx &= y例例例例: : : : a=12; a=12; a+=a-=a*a; a+=a-=a*a;/a=-264 /a=-264 等价于等价于等价于等价于a=a+(a=a-(a*a)a=a+(a=a-(a*a)例例例例: : : : int a=2; int a=2; a%=4-1; a%=4-1; a+=a*=a-=a*=3;
92、a+=a*=a-=a*=3; /a=0 /a=0 等价于等价于等价于等价于a=a+(a=a*(a=a-(a=a*3)a=a+(a=a*(a=a-(a=a*3)C C语言编程习惯语言编程习惯 (1) 一行只放一条语句。 (2) 养成随时给程序加注释的习惯。 (3) 程序的书写要有层次感,该缩进的一定要缩进。 (4) 编写函数时,变量定义部分和函数的执行部分之间增加一空行,或者在程序的执行部分按照完成的功能块增加相应的空行,会增加程序的易读性。 (5) 为变量起有意义的名字,既可以帮助程序员读懂程序,也可以避免变量的重复乱用,导致程序的逻辑错误。 (6) 在运算符和赋值符的两边加上一个空格会增加程
93、序的易读性。void main()void main() int i,sum;int i,sum;sum=0;sum=0;for (i=1;i=100;i+)for (i=1;i=100;i+)if (i%2 =0) sum+=i;if (i%2 =0) sum+=i;printf(sum=%d,sum);printf(sum=%d,sum); void main ( ) int i, sum; sum = 0; for (i = 1; i = 100; i+) if (i % 2 = = 0) sum += i; printf (sum = %d, sum);没有层次感没有层次感没有层次感没
94、有层次感层次清晰层次清晰层次清晰层次清晰本章小结本章小结 本章所介绍的主要内容是整型数据、实型数据和字符型本章所介绍的主要内容是整型数据、实型数据和字符型本章所介绍的主要内容是整型数据、实型数据和字符型本章所介绍的主要内容是整型数据、实型数据和字符型数据的常量表示法和变量定义格式,以及可以作用于这些数数据的常量表示法和变量定义格式,以及可以作用于这些数数据的常量表示法和变量定义格式,以及可以作用于这些数数据的常量表示法和变量定义格式,以及可以作用于这些数据类型的运算符。虽然本章的内容比较烦杂,学起来也许比据类型的运算符。虽然本章的内容比较烦杂,学起来也许比据类型的运算符。虽然本章的内容比较烦杂
95、,学起来也许比据类型的运算符。虽然本章的内容比较烦杂,学起来也许比较枯燥,但本章的内容是学好较枯燥,但本章的内容是学好较枯燥,但本章的内容是学好较枯燥,但本章的内容是学好C C C C语言的基础,是每个语言的基础,是每个语言的基础,是每个语言的基础,是每个C C C C语言程语言程语言程语言程序员必须熟练掌握的。现在我们一起来回忆一下本章有哪些序员必须熟练掌握的。现在我们一起来回忆一下本章有哪些序员必须熟练掌握的。现在我们一起来回忆一下本章有哪些序员必须熟练掌握的。现在我们一起来回忆一下本章有哪些内容值得我们特别留意和必须深刻领会的呢?内容值得我们特别留意和必须深刻领会的呢?内容值得我们特别留
96、意和必须深刻领会的呢?内容值得我们特别留意和必须深刻领会的呢? 变量的含义变量的含义变量的含义变量的含义 数据在内存中的表示形式数据在内存中的表示形式数据在内存中的表示形式数据在内存中的表示形式 不同类型的数据在内存中的表示范围不同类型的数据在内存中的表示范围不同类型的数据在内存中的表示范围不同类型的数据在内存中的表示范围 转义字符转义字符转义字符转义字符 有符号数与无符号数的区别有符号数与无符号数的区别有符号数与无符号数的区别有符号数与无符号数的区别 数据类型的自动转换与强制类型转换数据类型的自动转换与强制类型转换数据类型的自动转换与强制类型转换数据类型的自动转换与强制类型转换 各种运算符、运算符的优先级和结合性各种运算符、运算符的优先级和结合性各种运算符、运算符的优先级和结合性各种运算符、运算符的优先级和结合性