《C语言程序设计第三章 数据类型、运算符和表达式数学》由会员分享,可在线阅读,更多相关《C语言程序设计第三章 数据类型、运算符和表达式数学(48页珍藏版)》请在金锄头文库上搜索。
1、 C程序设计程序设计主讲人:袁丽主讲人:袁丽燕大里仁基础教学部第三章:数据类型第三章:数据类型 运算符和表达式运算符和表达式1 C C语言的基本元素语言的基本元素2 数据类型数据类型3 常量和变量常量和变量4 变量赋初值变量赋初值5 不同类型数据间的混合运算不同类型数据间的混合运算6 几种基本运算符及其表达式几种基本运算符及其表达式1 1、C C语言的基本元素:语言的基本元素:一、字符集一、字符集C C语言中使用的基本符号有如下五种:语言中使用的基本符号有如下五种:(1 1)大写字母:)大写字母:A A Z Z(2 2)小写字母:)小写字母:a a z z(3 3)阿拉伯数字:)阿拉伯数字:0
2、 0 9 9 (4 4)下划线:)下划线: (5 5)标点符号和运算符)标点符号和运算符: :二、标识符二、标识符用来标记常量、变量、函数以及文件名字的字符序列。用来标记常量、变量、函数以及文件名字的字符序列。标识符的构成规则:标识符的构成规则:u以字母(大小写皆可)或下划线开头;以字母(大小写皆可)或下划线开头;u随后可跟若干个(包括随后可跟若干个(包括0 0个)字母、数字、下划线;个)字母、数字、下划线;u标识符的长度各个系统不同,最好不要超过标识符的长度各个系统不同,最好不要超过8 8个字符;个字符;注意注意:区分大小写。:区分大小写。sumsum,SumSum是两个标识符。是两个标识符
3、。系统保留字三、关键字三、关键字 也称也称“保留字保留字”。它是。它是C C语言中具有特定含义、专门用作语言语言中具有特定含义、专门用作语言特定成分的一类标识符。特定成分的一类标识符。 ANSIANSI推荐的推荐的C C语言的关键字是语言的关键字是3232个(个(Turbo CTurbo C另扩展了另扩展了1111个)个) 如:如:main main 、int int 、charchar、floatfloat、definedefine等。等。注意注意:所有的关键字都有固定的意义,不能用作其他;:所有的关键字都有固定的意义,不能用作其他; 所有的关键字都必须小写;所有的关键字都必须小写;如:如:
4、elseelse与与ELSEELSE代表不同含义:代表不同含义:elseelse是关键字,是关键字,ELSEELSE是用户定义是用户定义 的标识符。的标识符。2 2、数据类型:、数据类型: 算法处理的对象是数据,而数据又以某种特定的形式存在。算法处理的对象是数据,而数据又以某种特定的形式存在。所谓数据的组织形式也就是数据结构,所谓数据的组织形式也就是数据结构,C C语言的数据结构是以语言的数据结构是以数据类型形式出现。数据类型形式出现。 所谓所谓类型类型,就是对数据分配存储单元的安排,包括存储单,就是对数据分配存储单元的安排,包括存储单元的长度元的长度( (占多少字节占多少字节) )以及数据的
5、存储形式以及数据的存储形式 不同的类型分配不同的长度和存储形式不同的类型分配不同的长度和存储形式C C语言允许使用的数据类型语言允许使用的数据类型: 数据类型的描述确定了数据在内存所占的空间大小,也确定了数据类型的描述确定了数据在内存所占的空间大小,也确定了其表示范围,以及规定数据所能进行的操作。其表示范围,以及规定数据所能进行的操作。 基本数据类型基本数据类型最主要的特点是,其值不可以再分解为其它类型。最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。也就是说,基本数据类型是自我说明的。 构造数据类型构造数据类型:构造数据类型是根据已定义的一个或多个:构造数据类
6、型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个值可以分解成若干个“成员成员”或或“元素元素”。每个。每个“成员成员”都是都是一个基本数据类型或又是一个构造类型。一个基本数据类型或又是一个构造类型。 指针类型指针类型:指针是一种特殊的,同时又是具有重要作用的数据:指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此变量的取值类似于整型量,
7、但这是两个类型完全不同的量,因此不能混为一谈。不能混为一谈。空类型空类型:在调用函数值时,通常应向调用者返回一个函数:在调用函数值时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明数定义及函数说明中给以说明。 例如在例题中给出的例如在例题中给出的maxmax函数定义中,函数头为:函数定义中,函数头为:int max(int a,int b);int max(int a,int b);其中其中“int int ”类型说明符即表示该类型说明符即表示该函数的返回值为整型量。但是,也有一类函数,调
8、用后并函数的返回值为整型量。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为不需要向调用者返回函数值,这种函数可以定义为“空类空类型型”。其类型说明符为。其类型说明符为voidvoid。(1 1)常量常量:在程序运行过程中,其值在程序运行过程中,其值不能被改变的量不能被改变的量n整型常量整型常量:如如10001000,1234512345,0 0,-345-3453 3、常量和变量:、常量和变量:数据有两种表现形式:常量和变量数据有两种表现形式:常量和变量它们可与数据类型结合起来分类。它们可与数据类型结合起来分类。 整型常量就是整常数。在语言中,使用的整常数有八进制、整
9、型常量就是整常数。在语言中,使用的整常数有八进制、十六进制和十进制三种。十六进制和十进制三种。11十进制整常数:十进制整常数没有前缀。其数码为十进制整常数:十进制整常数没有前缀。其数码为0 09 9。 以下各数是合法的十进制整常数:以下各数是合法的十进制整常数: 237 237、-568-568、6553565535、16271627; 以下各数不是合法的十进制整常数:以下各数不是合法的十进制整常数: 023 ( 023 (不能有前导不能有前导0)0)、23D (23D (含有非十进制数码含有非十进制数码) )。22八进制整常数:八进制整常数必须以八进制整常数:八进制整常数必须以0 0开头,即
10、以开头,即以0 0作为八进制数的前缀。作为八进制数的前缀。数码取值为数码取值为0 07 7。八进制数通常是无符号数。八进制数通常是无符号数。 以下各数是合法的八进制数:以下各数是合法的八进制数: 015( 015(十进制为十进制为13)13)、0101(0101(十进制为十进制为65)65)、0177777(0177777(十进制为十进制为65535)65535); 以下各数不是合法的八进制数:以下各数不是合法的八进制数: 256( 256(无前缀无前缀0)0)、03A2(03A2(包含了非八进制数码包含了非八进制数码) )、-0127(-0127(出现了负号出现了负号) )。33十六进制整常
11、数:十六进制整常数的前缀为十六进制整常数:十六进制整常数的前缀为0X0X或或0x0x。其数码取值为其数码取值为0909,AFAF或或afaf。 以下各数是合法的十六进制整常数:以下各数是合法的十六进制整常数:0X2A(0X2A(十进制为十进制为42)42)、0XA0 (0XA0 (十进制为十进制为160)160)、0XFFFF (0XFFFF (十进制为十进制为65535)65535); 以下各数不是合法的十六进制整常数:以下各数不是合法的十六进制整常数:5A (5A (无前缀无前缀0X)0X)、0X3H (0X3H (含有非十六进制数码含有非十六进制数码) )。n实型常量实型常量: :实型也
12、称为浮点型。实型常量也称为实数或者浮点实型也称为浮点型。实型常量也称为实数或者浮点数。在语言中,实数只采用十进制。它有数。在语言中,实数只采用十进制。它有两两种形式:十进种形式:十进制小数形式,指数形式。制小数形式,指数形式。 1 1十进制数形式:由数码十进制数形式:由数码0 90 9和小数点组成。和小数点组成。 例如:例如:0.00.0、25.025.0、5.7895.789、0.130.13、5.05.0、300.300.、-267.8230-267.8230等均为合法的等均为合法的实数。注意,必须有小数点。实数。注意,必须有小数点。 2 2指数形式:由十进制数,加阶码标志指数形式:由十进
13、制数,加阶码标志“e e”或或“E E”以及阶码(只能为以及阶码(只能为整数,可以带符号)组成。整数,可以带符号)组成。 其一般形式为:其一般形式为: a E n a E n(a a为十进制数,为十进制数,n n为十进制整数)其值为为十进制整数)其值为 a*10 a*10n n。 如:如: 2.1E5 ( 2.1E5 (等于等于2.1*102.1*105 5) ) 3.7E-2 ( 3.7E-2 (等于等于3.7*103.7*10-2-2) )n字符常量字符常量: 字符常量是用单引号括起来的一个字符。字符常量是用单引号括起来的一个字符。 例如:例如:aa、bb、=、+、?都是合法字符常量。都是
14、合法字符常量。 在语言中,字符常量有以下特点:在语言中,字符常量有以下特点:字符常量只能用单引号括起来,不能用双引号或其它括号。字符常量只能用单引号括起来,不能用双引号或其它括号。字符常量只能是单个字符,不能是字符串。字符常量只能是单个字符,不能是字符串。字符可以是字符集中任意字符。但数字被定义为字符型之后字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如就不能参与数值运算。如55和和5 5 是不同的。是不同的。55是字符常量,是字符常量,不能参与运算。不能参与运算。n转义字符转义字符:转义字符是一种特殊的字符常量。转义字符以反斜线转义字符是一种特殊的字符常量。转义字符
15、以反斜线开头,开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称原有的意义,故称“转义转义”字符。字符。 例如,在前面各例题例如,在前面各例题printfprintf函数的格式串中用到的函数的格式串中用到的“nn”就是一个转就是一个转义字符,其意义是义字符,其意义是“回车换行回车换行”。转义字符主要用来表示那些用一般字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码。不便于表示的控制代码。n字符串常量字符串常量: 字符串常量是由一对双引号括起的字符序列。字符串常量是由一对双引号括起的字符序列。 例如:例如
16、: CHINA CHINA , “C programC program” 等都是合法的字符串常量。等都是合法的字符串常量。 字符串常量和字符常量是不同的量。它们之间主要有以下区别:字符串常量和字符常量是不同的量。它们之间主要有以下区别: 字符常量由单引号括起来,字符串常量由双引号括起来。字符常量由单引号括起来,字符串常量由双引号括起来。字符常量只能是单个字符,字符串常量则可以含一个或多个字符。字符常量只能是单个字符,字符串常量则可以含一个或多个字符。可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。符
17、变量。在语言中没有相应的字符串变量。但是可以用一个字符数组来存放一个字符在语言中没有相应的字符串变量。但是可以用一个字符数组来存放一个字符串常量。串常量。字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加字节数加1 1。增加的一个字节中存放字符。增加的一个字节中存放字符0 (ASCII0 (ASCII码为码为0)0)。这是字符串结束的。这是字符串结束的标志。标志。例如:例如: 字符串字符串 “hellohello” 在内存中所占的字节为:在内存中所占的字节为:hell0o 字符常量字符常量aa和字符串常量
18、和字符串常量aa虽然都只有一个字符,但在内存中的虽然都只有一个字符,但在内存中的情况是不同的。情况是不同的。aa在内存中占一个字节,可表示为:在内存中占一个字节,可表示为:aaa在内存中占二个字节,可表示为:在内存中占二个字节,可表示为:a0n符号常量符号常量:用一个标识符代表的一个常量:用一个标识符代表的一个常量# define # define 标识符标识符 常量常量 符号常量在使用之前必须先定义,其一般形式为:符号常量在使用之前必须先定义,其一般形式为: 其中其中#define#define也是一条预处理命令(预处理命令都以也是一条预处理命令(预处理命令都以#开头),开头),称为宏定义命
19、令称为宏定义命令, ,其功能是把该标识符定义为其后的常量值。一经其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。定义,以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母习惯上符号常量的标识符用大写字母. .宏定义命令(放程序头部)宏定义命令(放程序头部)(2 2)变量变量:在程序运行期间,变量的值是可以改变的在程序运行期间,变量的值是可以改变的n变量用标识符(变量名)表示,在内存中占一定的存储单元变量用标识符(变量名)表示,在内存中占一定的存储单元n变量必须变量必须先定义先定义,后使用后使用n定义定义变量变量
20、时指定该变量的时指定该变量的名字名字和和类型类型 (类型符(类型符 标识符)标识符)n变量名变量名和和变量值变量值是是两个不同的概念两个不同的概念n变量名实际上是以一个名字代表的一个变量名实际上是以一个名字代表的一个存储地址存储地址n从变量中取值,实际上是通过变量名找到相应的内存地址,从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据从该存储单元中读取数据分别定义了整型,分别定义了整型,字符型,字符型,单精度,单精度,双精度类型的变量双精度类型的变量在书写变量说明时,应注意以下几点:在书写变量说明时,应注意以下几点:1.1.允许在一个类型说明符后,说明多个相同类型的变量
21、。各变允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。格间隔。2.2.最后一个变量名之后必须以最后一个变量名之后必须以“;”号结尾。号结尾。3.3.变量说明必须放在变量使用之前。一般放在函数体的开头部变量说明必须放在变量使用之前。一般放在函数体的开头部分。分。m100变量名变量值存储单元n整型变整型变量量:1 1)整型数据在内存中的存放形式:)整型数据在内存中的存放形式:数值是以补码表示的:数值是以补码表示的:正数的补码和原码相同;正数的补码和原码相同;负数的补码:将该数的绝
22、对值的二进制形式按位取反再加负数的补码:将该数的绝对值的二进制形式按位取反再加1 1。2 2)整型变量的分类)整型变量的分类基本型:类型说明符为基本型:类型说明符为intint,在内存中占,在内存中占2 2个字节。个字节。短整量:类型说明符为短整量:类型说明符为short intshort int或或shortshort。所占字节和取值范围均与基本型相同。所占字节和取值范围均与基本型相同。长整型:类型说明符为长整型:类型说明符为long intlong int或或longlong,在内存中占,在内存中占4 4个字节。个字节。无符号型:类型说明符为无符号型:类型说明符为unsignedunsig
23、ned。无符号型又可与上述三种类型匹配而构成:无符号型又可与上述三种类型匹配而构成:1)1)无符号基本型:类型说明符为无符号基本型:类型说明符为unsigned intunsigned int或或unsignedunsigned。2)2)无符号短整型:类型说明符为无符号短整型:类型说明符为unsigned shortunsigned short。3)3)无符号长整型:类型说明符为无符号长整型:类型说明符为unsigned longunsigned long。各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符
24、号位,故不能表示负数。但由于省去了符号位,故不能表示负数。n实型变实型变量量:1 1)实型数据在内存中的存放形式:)实型数据在内存中的存放形式:实型数据按指数形式存储。实型数据按指数形式存储。实数实数3.141593.14159在内存中的存放形式如下在内存中的存放形式如下:2 2)实型变量的分类)实型变量的分类小数部分占的位(小数部分占的位(bitbit)数愈多,数的有效数字愈多,精度愈高。)数愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。指数部分占的位数愈多,则能表示的数值范围愈大。实型变量分为:单精度(实型变量分为:单精度(floatfloat型)、双精度
25、(型)、双精度(doubledouble型)和长双精度型)和长双精度(long doublelong double型)三类。型)三类。例如:例如:float x,y; (x,yfloat x,y; (x,y为单精度实型量为单精度实型量) )double a,b,c; (a,b,cdouble a,b,c; (a,b,c为双精度实型量为双精度实型量) )n字符型变字符型变量量:字符变量用来存储字符常量,即单个字符。字符变量用来存储字符常量,即单个字符。字符变量的类型说明符是字符变量的类型说明符是charchar。字符变量类型定义的格式和书写。字符变量类型定义的格式和书写规则都与整型变量相同。例如
26、:规则都与整型变量相同。例如:char a,b;char a,b;1 1)字符型数据在内存中的存放形式:)字符型数据在内存中的存放形式:每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以字符值是以ASCIIASCII码的形式存放在变量的内存单元之中的。码的形式存放在变量的内存单元之中的。例如:例如:x x的十进制的十进制ASCIIASCII码是码是120120,y y的十进制的十进制ASCIIASCII码是码是121121。对字符变量对字符变量a,ba,b赋予赋予x x和和yy值:值:a=x;a=x; b=y;b=
27、y;实际上是在实际上是在a,ba,b两个单元内存放两个单元内存放120120和和121121的二进制代码:的二进制代码:a:b:所以可以看成是整型量。语言允许对整型变量赋以字符值,所以可以看成是整型量。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。量输出,也允许把整型量按字符量输出。 例:向字符变量赋以整数。例:向字符变量赋以整数。main( )main( ) char a,b; char a,b; a=120; a=120; b=121; b=121; pr
28、intf(%c,%cn,a,b); printf(%c,%cn,a,b);printf(%d,%dn,a,b); printf(%d,%dn,a,b); 本程序中定义a,b为字符型,但在赋值语句中赋以整型值。从结果看,a,b值的输出形式取决于printf函数格式串中的格式符,当格式符为c时,对应输出的变量值为字符,当格式符为d时,对应输出的变量值为整数。4 4、变量赋初值:、变量赋初值: 在程序中常常需要对变量赋初值,以便使用变量。在程序中常常需要对变量赋初值,以便使用变量。程序中可有多种方法为变量提供初值。这里介绍在作变量定义程序中可有多种方法为变量提供初值。这里介绍在作变量定义的同时给变量
29、赋以初值的方法。这种方法称为初始化。的同时给变量赋以初值的方法。这种方法称为初始化。在变量定义中赋初值的一般形式为:在变量定义中赋初值的一般形式为:类型说明符类型说明符 变量变量1= 1= 值值1 1,变量,变量2= 2= 值值2 2,;例如:例如:int a=3int a=3;int b,c=5;int b,c=5;char ch1=K,ch2=P;char ch1=K,ch2=P;应应注意注意,在定义中不允许连续赋值,如,在定义中不允许连续赋值,如a=b=c=5a=b=c=5是不合法的是不合法的 5.5.不同类型数据间的混合运算不同类型数据间的混合运算:(1)(1)+ +、- -、* *、
30、/ / 运算的两个数中有一个数为运算的两个数中有一个数为floatfloat或或doubledouble型,结果是型,结果是doubledouble型型。系统将系统将floatfloat型数据都先转换为型数据都先转换为doubledouble型,然后进行运算型,然后进行运算(2) (2) 如果如果intint型与型与floatfloat或或doubledouble型数据进行运算,先把型数据进行运算,先把intint型型和和floatfloat型数据转换为型数据转换为doubledouble型,然后进行运算,结果是型,然后进行运算,结果是doubledouble型型(3)(3)字符型数据与整型数
31、据进行运算,就是把字符的字符型数据与整型数据进行运算,就是把字符的ASCIIASCII代代码与整型数据进行运算码与整型数据进行运算例例:给定一个大写字母,要求用小写字母输出。给定一个大写字母,要求用小写字母输出。解题思路:解题思路:u关键是关键是找到大找到大、小写字母间小写字母间的的内在联系内在联系u同一个字母,用小写表示的字符的同一个字母,用小写表示的字符的ASCIIASCII代码比代码比用大写表示的字符的用大写表示的字符的ASCIIASCII代码大代码大3232有关有关ASCIIASCII码字符表码字符表 ASCIIASCII码即美国标准信息交换码(码即美国标准信息交换码(American
32、 Code for Information American Code for Information Interchange)Interchange)计算机只能理解数字,因此一个计算机只能理解数字,因此一个ASCIIASCII码就是一个字符,码就是一个字符,如:如:a a的数字表现形式,也可表示某种动作的数字表现形式,也可表示某种动作。 第第0-320-32号以及第号以及第127127号(共号(共3434个)是控制字符或通讯专用字符,个)是控制字符或通讯专用字符,如:控制字符:如:控制字符:LFLF(换行)、(换行)、CRCR(回车)、(回车)、DELDEL(删除)等;(删除)等;通讯专用字
33、符:通讯专用字符:SOHSOH(文头)等。(文头)等。 第第33-12633-126号(共号(共9494个)是字符,其中第个)是字符,其中第48-5748-57号为号为0-90-9十个阿拉伯数字;十个阿拉伯数字;65-9065-90号为号为2626个大写英文字母,个大写英文字母,97-12297-122号为号为2626个小写英文字母,其余个小写英文字母,其余一些为标点符号、运算符号等。一些为标点符号、运算符号等。#include #include int main ( )int main ( ) char c1,c2; char c1,c2; c1= c1=A A; ; c2=c1+32; c
34、2=c1+32; printf(%cn,c2); printf(%cn,c2); printf( printf(”%dn%dn”,c2); ,c2); return 0; return 0; 将字符将字符A的的ASCII代码代码65放到放到c1中中将将65+32的的结果结果放到放到c2中中用字符形式输出用字符形式输出用十进制形式输出用十进制形式输出6 6、各类数值型数据之间的混合运算、各类数值型数据之间的混合运算 变量的数据类型是可以转换的。转换的方法有两种,变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。一种是自动转换,一种是强制转换。自动转换自动转换遵循以下规
35、则:遵循以下规则:u若参与运算量的类型不同,则先转换成同一类型,然后进行运算。若参与运算量的类型不同,则先转换成同一类型,然后进行运算。u转换按数据长度增加的方向进行,以保证精度不降低。转换按数据长度增加的方向进行,以保证精度不降低。如如intint型和型和longlong型运算时,先把型运算时,先把intint量转成量转成longlong型后再进行运算。型后再进行运算。u所有的浮点运算都是以双精度进行的,即使仅含所有的浮点运算都是以双精度进行的,即使仅含floatfloat单精度量单精度量运算的表达式,也要先转换成运算的表达式,也要先转换成doubledouble型,再作运算。型,再作运算。
36、ucharchar型和型和shortshort型参与运算时,必须先转换成型参与运算时,必须先转换成intint型。型。u在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度大于的类型将转换为左边量的类型。如果右边量的数据类型长度大于左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。四舍五入向前舍入。强制类型转换强制类型转换强制类型转换是通过类型转换运算来实现的。强制类型转换是通过类型转换运算来实现的。其一
37、般形式为:其一般形式为: ( (类型说明符类型说明符) () (表达式表达式) )其功能是把表达式的运算结果强制转换成类型说明符所表示的类型其功能是把表达式的运算结果强制转换成类型说明符所表示的类型例如:例如: (float) a (float) a 把把a a转换为实型转换为实型 (int)(x+y) (int)(x+y) 把把x+yx+y的结果转换为整型的结果转换为整型在使用强制转换时应注意以下问题:在使用强制转换时应注意以下问题:类型说明符和表达式都必须加括号类型说明符和表达式都必须加括号( (单个变量可以不加括号单个变量可以不加括号) ),如把如把(int)(x+y)(int)(x+y
38、)写成写成(int)x+y(int)x+y则成了把则成了把x x转换成转换成intint型之后再与型之后再与y y相加了。相加了。无论是强制转换或是自动转换,都只是为了本次运算的需要而对无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型定义的类型。main( )main( ) float f=5.75; float f=5.75; printf(int)f=%d,f=%fn,(int)f,f); printf(int)f=%d,f=%fn,(int)f,f); 本
39、例表明,本例表明,f f虽强制转为虽强制转为intint型,但只在运算中起作用,是临时的,型,但只在运算中起作用,是临时的,而而f f本身的类型并不改变。本身的类型并不改变。因此,因此,(int)f(int)f的值为的值为 5(5(删去了小数删去了小数) )而而f f的值仍为的值仍为5.755.75。7 7、运算符与表达式、运算符与表达式语言的运算符可分为以下几类:语言的运算符可分为以下几类:算术运算符算术运算符: :用于各类数值运算用于各类数值运算包括加包括加(+)(+)、减、减(-)(-)、乘、乘(*)(*)、除、除(/)(/)、求余、求余( (或称模运算,或称模运算,%)%)、自增、自增
40、(+)(+)、自减、自减(-)(-)共共七种。七种。关系运算符关系运算符: :用于比较运算用于比较运算包括大于包括大于()()、小于、小于()(=)(=)、小于等于、小于等于(=)(=)和不等于和不等于(!=)(!=)六六种。种。逻辑运算符逻辑运算符: :用于逻辑运算用于逻辑运算包括与包括与(&)(&)、或、或(|)(|)、非、非(!)(!)三种。三种。位操作运算符位操作运算符: :参与运算的量,按二进制位进行运算参与运算的量,按二进制位进行运算包括位与包括位与(&)(&)、位或、位或(|)(|)、位非、位非()()、位异或、位异或()()、左移、左移()()()六种。六种。赋值运算符赋值运算
41、符: :用于赋值运算用于赋值运算分为简单赋值分为简单赋值(=)(=)、复合算术赋值、复合算术赋值(+=,-=,*=,/=,%=)(+=,-=,*=,/=,%=)复合位运算赋值复合位运算赋值(&=,|=,=,=,=,=)三类共十一种。三类共十一种。条件运算符条件运算符: :这是一个三目运算符这是一个三目运算符用于条件求值用于条件求值(?:)(?:)。逗号运算符逗号运算符: :用于把若干表达式组合成一个表达式用于把若干表达式组合成一个表达式( (,) )指针运算符指针运算符: :用于取内容用于取内容(*)(*)和取地址和取地址(&)(&)二种运算二种运算求字节数运算符求字节数运算符: :用于计算数
42、据类型所占的字节数用于计算数据类型所占的字节数(sizeof)(sizeof)特殊运算符特殊运算符: :有括号有括号()(),下标,下标 ,成员,成员( ( ,.).)等几种等几种。1.1.算术运算符和算术表达式算术运算符和算术表达式(1 1)基本的算术运算符基本的算术运算符:+ + :正号运算符正号运算符( (单目运算符单目运算符) ) - - :负号运算符负号运算符( (单目运算符单目运算符) )* * :乘法运算符乘法运算符/ / :除法运算符除法运算符% % :求余运算符求余运算符+ + :加法运算符加法运算符 - - :减法运算符减法运算符(2 2)算术表达式和运算符的优先级和结合性
43、)算术表达式和运算符的优先级和结合性 表达式是由常量、变量、函数和运算符组合起来的式子。表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,一个表达式有一个值及其类型, 它们等于计算表达式所得结果它们等于计算表达式所得结果的值和类型。的值和类型。 表达式求值按运算符的优先级和结合性规定的顺序进行。表达式求值按运算符的优先级和结合性规定的顺序进行。 单个的常量、变量、函数可以看作是表达式的特例。单个的常量、变量、函数可以看作是表达式的特例。算术表达式:用算术运算符和括号将运算对象(也称操作数)算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合连接起来
44、的、符合C C语法规则的式子。语法规则的式子。以下是算术表达式的例子:以下是算术表达式的例子:a+ba+b(a*2)(a*2)c c(x+r)*8-(a+b)(x+r)*8-(a+b)7 7sin(x)+sin(y)sin(x)+sin(y)(+i)-(j+)+(k-)(+i)-(j+)+(k-) 运算符的优先级:语言中,运算符的运算优先级共分为运算符的优先级:语言中,运算符的运算优先级共分为1515级。级。1 1级最高,级最高,1515级最低。在表达式中,优先级较高的先于优先级较低级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按的进行运算
45、。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。运算符的结合性所规定的结合方向处理。运算符的结合性:语言中各运算符的结合性分为两种,即运算符的结合性:语言中各运算符的结合性分为两种,即左结合性左结合性( (自左至右自左至右) )和右结合性和右结合性( (自右至左自右至左) )。 例如算术运算符的结合性是自左至右,即先左后右。如有表达式例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+zx-y+z则则y y应先与应先与“- -”号结合,执行号结合,执行x-yx-y运算,然后再执行运算,然后再执行+z+z的运算。这种自左至的运算。这种自左至右的结合方
46、向就称为右的结合方向就称为“左结合性左结合性”。而自右至左的结合方向称为。而自右至左的结合方向称为“右结合右结合性性”。 最典型的右结合性运算符是赋值运算符。如最典型的右结合性运算符是赋值运算符。如x=y=z,x=y=z,由于由于“= =”的右的右结合性,应先执行结合性,应先执行y=zy=z再执行再执行x=(y=z)x=(y=z)运算。运算。(3 3)自增、自减运算符自增、自减运算符 自增,自减运算符自增,自减运算符: :自增自增1 1运算符记为运算符记为“+”,其,其功能是使变量的值自增功能是使变量的值自增1 1。 自减自减1 1运算符记为运算符记为“-”,其功能是使变量值自减,其功能是使变
47、量值自减1 1。自增自增1 1,自减,自减1 1运算符均为单目运算,都具有右结合性。可有运算符均为单目运算,都具有右结合性。可有以下几种形式:以下几种形式:+i i+i i自增自增1 1后再参与其它运算。后再参与其它运算。-i i-i i自减自减1 1后再参与其它运算。后再参与其它运算。i+ ii+ i参与运算后,参与运算后,i i的值再自增的值再自增1 1。i- ii- i参与运算后,参与运算后,i i的值再自减的值再自减1 1。例题:例题:main( ) int i=8; printf(%dn,+i); printf(%dn,-i); printf(%dn,i+); printf(%dn,
48、i-); printf(%dn,-i+); printf(%dn,-i-); 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)。2.2.关系运算符和关系表达式关系运算符和关系表达式 (1)(1) 比较两个量的运
49、算符称为关系运算符。比较两个量的运算符称为关系运算符。 在语言中有以下在语言中有以下关系运算符:关系运算符: 小于小于= 大于大于= = 大于或等于大于或等于= = 等于等于!= != 不等于不等于 u关系运算符都是双目运算符,其结合性均为左结合。关系运算符都是双目运算符,其结合性均为左结合。u 关系运算符的优先级低于算术运算符,高于赋值运算符。关系运算符的优先级低于算术运算符,高于赋值运算符。u 在六个关系运算符中,在六个关系运算符中,,=,=的优先级相同的优先级相同, ,高于高于=和和!=!=, = =和和!=!=的优先级相同。的优先级相同。 (2)(2) 关系表达式关系表达式 关关 系表
50、达式的一般形式为:系表达式的一般形式为: 表达式表达式 关系运算符关系运算符 表达式表达式 例如:例如:a+bc-d,x3/2,a+1c-d,x3/2,a+1(bc),a!=(c=d)a(bc),a!=(c=d)等。等。关系表达式的值是关系表达式的值是“真真”和和“假假”,用,用“1 1”和和“0 0”表示。表示。如:如: 5050的值为的值为“真真”,即为,即为1 1。 (a=3)(b=5) (a=3)(b=5)由于由于3535不成立,故其值为假,即为不成立,故其值为假,即为0 0。 (1)(1) 逻辑运算:用来判断一件事情是逻辑运算:用来判断一件事情是“对对”还是还是“错错”,或者说是,或
51、者说是“成立成立”还是还是“不成立不成立”,判断的结果有两种,称为,判断的结果有两种,称为“逻辑值逻辑值”,用数的符号表示就是用数的符号表示就是“1 1”或或“0 0”. .(2 2) C C语言提供三种逻辑运算符:语言提供三种逻辑运算符: & &逻辑与(相当于逻辑与(相当于“同时同时”) | |逻辑或(相当于逻辑或(相当于“或者或者”) ! !逻辑非(相当于逻辑非(相当于“否定否定”) 逻辑运算符把各个运算的变量(或常量)连接起来组成一个逻辑运算符把各个运算的变量(或常量)连接起来组成一个逻辑表达式逻辑表达式。(3)运算规则:运算规则:&:当且仅当两个运算量的值都为:当且仅当两个运算量的值都
52、为“真真”时,运算结果为时,运算结果为“真真”,否则为,否则为“假假” | | :当且仅当两个运算量的值都为:当且仅当两个运算量的值都为“假假”时,运算结果为时,运算结果为“假假”,否则为,否则为“真真” ! ! :当运算量的值为:当运算量的值为“真真”时,运算结果为时,运算结果为“假假”;当运算量的值为;当运算量的值为“假假”时,时, 运算结果为运算结果为“真真”。3.3.逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 (4)(4)逻辑运算符的运算优先级逻辑运算符的运算优先级1 1)逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:)逻辑非的优先级最高,逻辑与次之,逻辑或最低,即: !(非)!(
53、非) &(与)(与) |(或)(或)2 2)与其它种类运算符的优先关系)与其它种类运算符的优先关系 ! 算术运算算术运算 关系运算关系运算 & | & | 赋值运算赋值运算(5 5)逻辑表达式:)逻辑表达式:用逻辑运算符将用逻辑运算符将1 1个或多个表达式连接起来,进行逻辑运算的式子。个或多个表达式连接起来,进行逻辑运算的式子。u在在C C语言中,用逻辑表达式表示多个条件的组合。语言中,用逻辑表达式表示多个条件的组合。u在逻辑表达式里有参加逻辑运算的逻辑量及逻辑运算最后的结果在逻辑表达式里有参加逻辑运算的逻辑量及逻辑运算最后的结果(逻辑值)。(逻辑值)。逻辑量逻辑量凡是参加逻辑运算的变量、常量
54、都是逻辑量。凡是参加逻辑运算的变量、常量都是逻辑量。逻辑值逻辑值逻辑量、逻辑表达式其最后的运算结果的值就是逻辑值。逻辑量、逻辑表达式其最后的运算结果的值就是逻辑值。说明:说明:(1 1)逻辑运算符两侧的操作数,除可以是和非的整数外,)逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。也可以是其它任何类型的数据,如实型、字符型等。(2 2)在计算逻辑表达式时,只有在必须执行下一个表达式才)在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式(即并不是所有的表达式都被求解)能求解时,才求解该表达式(即并不是所有的表达式都被求解)。换句话
55、说:。换句话说: 1 1)对于逻辑)对于逻辑与与运算,如果第一个操作数被判定为运算,如果第一个操作数被判定为“假假”,系统不再判定或求解第二操作数。系统不再判定或求解第二操作数。 2 2)对于逻辑)对于逻辑或或运算,如果第一个操作数被判定为运算,如果第一个操作数被判定为“真真”,系统不再判定或求解第二操作数。系统不再判定或求解第二操作数。例如,假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1n2)&(y=n3n4)”后,x的值变为,而y的值不变,仍等于1!4.4.赋值运算符和赋值表达式赋值运算符和赋值表达式(1 1)赋值运算符)赋值运算符 简单赋值运
56、算符和表达式简单赋值运算符和表达式: :简单赋值运算符记为简单赋值运算符记为“= =”。 由由“= = ”连接的式子称为赋值表达式。连接的式子称为赋值表达式。 其一般形式为:变量其一般形式为:变量= =表达式表达式例如:例如: x=a+bx=a+b w=sin(a)+sin(b) w=sin(a)+sin(b) y=i+-j y=i+-j赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此赋值运算符具有右结合性。因此 a=b=c=5a=b=c=5可理解为可理解为 a=(b=(c=5)a=(b=(c=5)(2 2)复合的
57、赋值运算符)复合的赋值运算符在赋值符在赋值符“= =”之前加上其它二目运算符可构成复合赋值符。之前加上其它二目运算符可构成复合赋值符。如如+=,-=,*=,+=,-=,*=,=,%=,=,&=,=,|=,%=,=,&=,=,|=。 构成复合赋值表达式的一般形式为:构成复合赋值表达式的一般形式为:变量变量 双目运算符双目运算符= =表达式表达式它等效于它等效于变量变量= =变量变量 运算符运算符 表达式表达式例如:例如: a+=5 a+=5 等价于等价于a=a+5a=a+5 x*=y+7 x*=y+7 等价于等价于x=x*(y+7)x=x*(y+7) r%=p r%=p 等价于等价于r=r%pr
58、=r%p5.5.逗号运算符和逗号表达式逗号运算符和逗号表达式(1 1)在语言中逗号在语言中逗号“,”也是一种运算符,称为逗号运算符。也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式,其功能是把两个表达式连接起来组成一个表达式, 称为逗号表称为逗号表达式。达式。 其一般形式为:其一般形式为: 表达式表达式1 1,表达式,表达式2 2其求值过程是分别求两个表达式的值,并以表达式其求值过程是分别求两个表达式的值,并以表达式2 2的值作为整的值作为整个逗号表达式的值。个逗号表达式的值。例:例:main( )main( ) int a=2,b=4,c=6,x,y; int a
59、=2,b=4,c=6,x,y; y=(x=a+b),(b+c); y=(x=a+b),(b+c); printf(y=%d,x=%d,y,x); printf(y=%d,x=%d,y,x); 本例中,y等于整个逗号表达式的值,也就是表达式2的值,x是第一个表达式的值。(2 2)说明:说明:逗号表达式一般形式中的表达式逗号表达式一般形式中的表达式1 1和表达式和表达式2 2 也可以又是逗号表也可以又是逗号表达式。达式。例如:例如: 表达式表达式1 1,( (表达式表达式2 2,表达式,表达式3)3)形成了嵌套情形。因此可以把逗号表达式扩展为以下形式:形成了嵌套情形。因此可以把逗号表达式扩展为以下
60、形式: 表达式表达式1 1,表达式,表达式2 2,表达式表达式n n整个逗号表达式的值等于表达式整个逗号表达式的值等于表达式n n的值。的值。u程序中使用逗号表达式,通常是要分别求逗号表达式内各表程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。达式的值,并不一定要求整个逗号表达式的值。u并不是在所有出现逗号的地方都组成逗号表达式,如在变量并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符说明中,函数参数表中逗号只是用作各变量之间的间隔符。例:逗号表达式例:逗号表达式 a=3*5a=3*5,a*4a
61、*4对此表达式的求解对此表达式的求解赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为 60。例:比较下面两个表达式的作用的不同例:比较下面两个表达式的作用的不同: : x=(a=3x=(a=3,6*3)6*3) x=a=3 x=a=3,6*a6*a第个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。例:函数参数也是用逗号来间隔的。如例:函数参数也是用逗号来间隔的。如printf(%dp
62、rintf(%d,%d%d,%d%d,a a,b b,c)c);上一行中的上一行中的“a a,b b,c c”并不是一个逗号表达式,它是并不是一个逗号表达式,它是printfprintf函数的函数的3 3个参数,参数间用逗号间隔。个参数,参数间用逗号间隔。如果改写为如果改写为printf(%dprintf(%d,%d%d,%d%d,(a(a,b b,c)c),b b,c)c);则则“(a(a,b b,c)c)”是一个逗号表达式,它的值等于是一个逗号表达式,它的值等于c c的值。括弧的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为是一个整体,作为printfprintf函数的一个参数。函数的一个参数。