《第三章 数据类型,运算符与表达式》由会员分享,可在线阅读,更多相关《第三章 数据类型,运算符与表达式(51页珍藏版)》请在金锄头文库上搜索。
1、第三章第三章 数据类型,运算符与表达式数据类型,运算符与表达式3.1 C3.1 C的数据类型的数据类型3.2 3.2 常量与变量常量与变量3.3 3.3 整型数据整型数据3.4 3.4 浮点型数据运行浮点型数据运行3.5 3.5 字符型数据字符型数据 3.3.变量赋初值变量赋初值 3.7 3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算 3.8 3.8 算术运算符和算术表达式算术运算符和算术表达式 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式3.1 C3.1 C语言的数据类型语言的数据类型C数据类型数
2、据类型基本类型基本类型基本类型基本类型指针类型指针类型构造类型构造类型整型整型整型整型 字符型字符型字符型字符型 实型实型实型实型( (浮点型浮点型浮点型浮点型) ) 空类型空类型空类型空类型单精度型单精度型单精度型单精度型 双精度型双精度型双精度型双精度型 数组类型数组类型结构体类型结构体类型共用体类型共用体类型枚举类型枚举类型3.2 常量与变量常量与变量3.2.1 常量和符号常量常量和符号常量在程序运行过程中在程序运行过程中,其值不能被改变的量称为常量其值不能被改变的量称为常量常量区分为不同的类型:常量区分为不同的类型:整型整型 100,125,-100实型实型 3.14 , 0.125字
3、符型字符型 a, b字符字符串常量串常量 “string”表示方法表示方法3.2 常量与变量常量与变量1. 在程序运行中,值发生变化在程序运行中,值发生变化 2. 必须先定义,再使用必须先定义,再使用 3. 变量通过变量名标识变量通过变量名标识uu变量名和内存中的存储单元相对应。变量名和内存中的存储单元相对应。变量名和内存中的存储单元相对应。变量名和内存中的存储单元相对应。uu编写程序时通过变量名来存、取存储单元。编写程序时通过变量名来存、取存储单元。编写程序时通过变量名来存、取存储单元。编写程序时通过变量名来存、取存储单元。类型类型 变量名表变量名表 Int a,b;变量变量3.2.2 变量
4、变量memorya82563.2 常量与变量常量与变量变量命名的规定:变量命名的规定:(1)(1)语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。符必须为字母或下划线。例:例:sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John, ¥123,3D64,ab (2)不能用系统中的关键字作为变量名)不能用系统中的关键字作为变量名(3)变量名中的字母是区分大小写的。变量名中的字母是区分大小写的。如:如:sumsum、stu
5、_namestu_name、_age_age、Lts_1_2Lts_1_2、a2a232c32c、x.yx.y、start+9start+9、c2.0 c2.0 NAME name NAME name 表示两个不同的标识符。表示两个不同的标识符。不提倡大小写混合使用不提倡大小写混合使用int a;.A=5;3.3 整型变量整型变量3.3.13.3.1整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数整型常量即整常数。在语言中,整常数可用以下三种形式表示可用以下三种形式表示:(1)(1)十进制整数。十进制整数。 如:如:123, -456.4123, -456.4。(2)(
6、2)八进制整数。以八进制整数。以0 0头的数是八进制数。头的数是八进制数。 如:如:01230123表示八进制数表示八进制数123123,等于十进制数,等于十进制数83,-01183,-011表示八进制数表示八进制数-11,-11,即十进制数即十进制数-9-9。(3)(3)十六进制整数。以十六进制整数。以0x0x开头的数是开头的数是1616进制数。进制数。 如:如:0x1230x123,代表代表1616进制数进制数123,123,等于十进制数等于十进制数 291291。 -0x12-0x12等于十进制数等于十进制数1010。 3.3 整型变量整型变量3.3.2 3.3.2 整型变量整型变量 (
7、1)(1)整型数据在内存中的存放形式整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。数据在内存中是以二进制形式存放的。 如如: : intint i; /* i; /* 定义为整型变量定义为整型变量 * */ / i=10; /* i=10; /* 给给i i赋以整数赋以整数10 */10 */ 注意:注意:注意:注意:十进制数十进制数10的二进制形式为的二进制形式为1010,Turbo C 2.0和和Turbo C+ 3.0为一个整型变量在内存中分配为一个整型变量在内存中分配2个字节的存储单元个字节的存储单元(不同的编不同的编译系统为整型数据分配的字节数是不相同的,译系统为整型
8、数据分配的字节数是不相同的,VC+ 6.0则分配则分配4个字节)。个字节)。数值是以补码数值是以补码(complement) 表示的。表示的。 3.3.2 3.3.2 整型变量整型变量六种六种有符号基本整型有符号基本整型有符号短整型有符号短整型有符号长整型有符号长整型无符号基本整型无符号基本整型无符号短整型无符号短整型无符号长整型无符号长整型(signed)int (signed)short (int )(signed) long (int)unsigned intunsigned short (int)unsigned long (int)(2 2) 整型变量的分类整型变量的分类整数类型的有
9、关数据:整数类型的有关数据: 类型说明符类型说明符 长度长度 数的范围数的范围基本型基本型 intint 2 2字节字节 -32768-327683276732767短整型短整型 short short 2 2字节字节 -2-215152 21515-1-1 长整型长整型 long long 4 4字节字节 -2-231312 23131-1-1无符号整型无符号整型 unsigned unsigned 2 2字节字节 0 06553565535无符号短整型无符号短整型 unsigned short unsigned short 2 2字节字节 0 06553565535无符号长整型无符号长整型
10、 unsigned long unsigned long 4 4字节字节 0 0(2 23232-1-1)3.3 整型变量整型变量(3 3)整型变量的定义)整型变量的定义: : 规定在程序中所有用到的变量都必须在程序中定义,即规定在程序中所有用到的变量都必须在程序中定义,即“强制强制类型定义类型定义”。 例如例如: : intint a,b a,b(指定变量、为整型)指定变量、为整型) unsigned short c,d;unsigned short c,d;(指定变量、为无符号短整型)指定变量、为无符号短整型) long e,f;long e,f;( (指定变量、为长整型)指定变量、为长整
11、型)3.3 整型变量整型变量3.3.3 整型常量的类型整型常量的类型(1)(1)一个整数,如果其值在一个整数,如果其值在-32768-32768+32767+32767范围内,认为它是范围内,认为它是intint型,型,它可以赋值给它可以赋值给intint型和型和long long intint型变量。型变量。(2) (2) 一个整数,如果其值超过了上述范围,而在一个整数,如果其值超过了上述范围,而在-2147483637-2147483637+2147483647+2147483647范围内,则认为它是为长整型。可以将它赋值给一个范围内,则认为它是为长整型。可以将它赋值给一个long lon
12、g intint型变量型变量。 (3) 如果所用的如果所用的C版本(如版本(如Turbo C)分配给分配给short int与与int型数据在型数据在内存中占据的长度相同,则它的表数范围与内存中占据的长度相同,则它的表数范围与int型相同。因此一个型相同。因此一个int型的常量同时也是一个型的常量同时也是一个short int型常量,可以赋给型常量,可以赋给int型或型或short int型量。型量。3.3.3 整型常量的类型整型常量的类型(4) (4) 一个整常量后面加一个字母一个整常量后面加一个字母u u或或U U,认为是认为是unsigned unsigned intint型,型,如如1
13、2345u12345u,在内存中按在内存中按unsigned unsigned intint规定的方式存放规定的方式存放( (存储单元中最存储单元中最高位不作为符号位,而用来存储数据高位不作为符号位,而用来存储数据) )。如果写成。如果写成-12345u-12345u,则先将则先将-12345-12345转换成其补码转换成其补码5319153191,然后按无符号数存储。,然后按无符号数存储。(5) 在一个整常量后面加一个字母在一个整常量后面加一个字母l或或L,则认为是则认为是long int型常量。型常量。例如例如123l.432L.0L等。这往往用于函数调用中。如果函数的形参为等。这往往用于
14、函数调用中。如果函数的形参为long int型,型,则要求实参也为则要求实参也为long int型。型。3.4 浮点型数据浮点型数据两种表示两种表示形式形式十进制小数十进制小数指数形式指数形式0.1230.1233 3e-3e-3注意注意: :字母字母e(e(或或E)E)之前必须有数字,且之前必须有数字,且e e后面的指数必须为整数后面的指数必须为整数 1e31e31e31e3、1.8e-31.8e-31.8e-31.8e-3、-123e-6-123e-6-123e-6-123e-6、-.1e-3-.1e-3-.1e-3-.1e-3e3e3e3e3、2.1e3.52.1e3.52.1e3.52
15、.1e3.5、.e3.e3.e3.e3、e e e e 3.4.1 浮点型常量的表示方法浮点型常量的表示方法3.4.2 浮点型变量浮点型变量(1)(1)浮点型数据在内存中的存放形式浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占一个浮点型数据一般在内存中占4 4个字节个字节(32(32位位) )。与整型数据的。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式指数形式。(2)
16、(2) 浮点型变量的分类浮点型变量的分类 浮点型变量分为单精度(浮点型变量分为单精度(floatfloat型)、双精度(型)、双精度(doubledouble型)和长型)和长双精度型(双精度型(long doublelong double)三类形式。三类形式。3.4.3 浮点型常量的类型浮点型常量的类型C C编译系统将浮点型常量作为双精度来处理。编译系统将浮点型常量作为双精度来处理。 例如例如:f = 2.45678 * 4523.65f = 2.45678 * 4523.65 系统先把系统先把2.456782.45678和和4523.654523.65作为双精度数,然后进行相乘的运算,作为双
17、精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前得到的乘也是一个双精度数。最后取其前7 7位赋给浮点型变量位赋给浮点型变量f f。如是在如是在数的后面加字母数的后面加字母f f或或F F(如(如1.65f, 654.87F1.65f, 654.87F),),这样编译系统就会把它们这样编译系统就会把它们按单精度(按单精度(3232位)处理。位)处理。3.53.5字符型数据字符型数据3.5.1 字符常量字符常量(1)用单引号包含的一个字符是字符型常量用单引号包含的一个字符是字符型常量(2)只能包含一个字符只能包含一个字符 有些以有些以“ ”开头的特殊字符称为转义字符开头的特殊字符称
18、为转义字符 n n 换行换行 t t 横横向跳格向跳格 r r 回回车车 反反斜杠斜杠 dddddd dddddd表示表示1 1到到3 3位位八进制八进制数字数字 xhhxhh hhhh表示表示1 1到到2 2位位十六进制十六进制数字数字字符型变量用来存放字符常量,注意只能放一个字符。字符型变量用来存放字符常量,注意只能放一个字符。字符变量的定义形式如下:字符变量的定义形式如下:char c1,c2;char c1,c2;在本函数中可以用下面语句对在本函数中可以用下面语句对c1,c2c1,c2赋值:赋值: c1c1aa;c2c2 b b ;一个字符变量在内存中占一个字节。一个字符变量在内存中占
19、一个字节。 3.5.3字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的内存单元中去,而是将该字符的相应的ASCIIASCII代码放到存储单元中。代码放到存储单元中。3.5.2字符变量字符变量3.5.4字符串常量字符串常量字符串常量是一对双撇号括起来的字符序列字符串常量是一对双撇号括起来的字符序列. .合法的字符串常量合法的字符串常量:“How do you do.”, “CHINA”:“How do you d
20、o.”, “CHINA”, “ “a” a” ,“$123.45”$123.45” 是字符常量,是字符常量,”是字符串常量,二者不同。是字符串常量,二者不同。 如:如:假设被指定为字符变量假设被指定为字符变量 :char cchar cc=c=a a; ; ”a a”;c c”CHINACHINA”; ; 结论:结论:不能把一个字符串常量赋给一个字符变量不能把一个字符串常量赋给一个字符变量。规定:在每一个字符串常量的结尾加一个规定:在每一个字符串常量的结尾加一个 “字符串结束标志字符串结束标志”,以便系统据此判断字符串是否结束。以便系统据此判断字符串是否结束。规定以字符规定以字符作为字符串结束
21、标志作为字符串结束标志。 如:如:如果有一个字符串常量如果有一个字符串常量”chinachina” ,实际上在内存中是:实际上在内存中是: 它占内存单元不是个字符,而是个字符,最后一个字符为它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出但在输出时不输出。c hin a0字符串结字符串结束标记束标记3.6变量赋初值变量赋初值字符串常量字符串常量(1)(1)语言允许在定义变量的同时使变量初始化语言允许在定义变量的同时使变量初始化如如: : float f=3.56; / float f=3.56; / 指定为浮点型变量,初值为指定为浮点型变量,初值为.56 .56 char
22、c= char c= a a; / ; / 指定为字符变量,初值为指定为字符变量,初值为a a (2)(2)可以使被定义的变量的一部分赋初值。可以使被定义的变量的一部分赋初值。 如如: : intint a,b,c=5 a,b,c=5; 表示指定、为整型变量,但只对初始表示指定、为整型变量,但只对初始化,化,c c的初值为的初值为(3)(3)如果对几个变量赋以同一个初值,如果对几个变量赋以同一个初值, 应写成:应写成:intint a=3,b=3,c=3; a=3,b=3,c=3; 表示、的初值都是。表示、的初值都是。 不能写成不能写成 intint a=b=c3; a=b=c3; 注意:注意
23、:初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。初值的,相当于有一个赋值语句。 3.7各类数值型数据间的混合运算各类数值型数据间的混合运算整型(包括整型(包括int,short,longint,short,long)、)、浮点型浮点型(包括(包括float,doublefloat,double)可以混合运算。在可以混合运算。在进行运算时,不同类型的数据要先转换成进行运算时,不同类型的数据要先转换成同一类型同一类型, ,然后进行运算然后进行运算. .3.8算术运算符和算术表达式算术运算符和算术表达式(
24、1)(1)算术运算符算术运算符 (+ - * / %+ - * / %)(2)(2)关系运算符关系运算符 (!(!)(3)(3)逻辑运算符逻辑运算符 (!(!|)(4)(4)位运算符位运算符 ( | |)(5)(5)赋值运算符赋值运算符 (及其扩展赋值运(及其扩展赋值运算符)算符)(6)(6)条件运算符条件运算符 (?:)(?:)(7)(7)逗号运算符逗号运算符 ( (,),)(8)(8)指针运算符指针运算符 (* *和)和)(9)(9)求字节数运算符()求字节数运算符()(10)(10)强制类型转换运算符强制类型转换运算符( ( (类型)类型) ) )(11)(11)分量运算符(分量运算符(
25、-)(12)(12)下标运算符()下标运算符()(13)(13)其他其他 (如函数调用运算符()(如函数调用运算符()3.8.1 运算符简介运算符简介 的运算符有以下几类:的运算符有以下几类:3.8算术运算符和算术表达式算术运算符和算术表达式3.8.2 算术运算符和算术表达式算术运算符和算术表达式 (1)(1)基本的算术运算符基本的算术运算符: : (加法运算符,或正值运算符。如加法运算符,或正值运算符。如: :、)、) (减法运算符,或负值运算符。减法运算符,或负值运算符。如如: :、)、) * * (乘法运算符。如(乘法运算符。如: :* *) (除法运算符。如除法运算符。如: :) (模
26、运算符,或称求余运算符,两侧均应为整型数据,如模运算符,或称求余运算符,两侧均应为整型数据,如: :的值为)。的值为)。(2) (2) 算术表达式和运算符的优先级与结合性基本的算术运算符算术表达式和运算符的优先级与结合性基本的算术运算符: : 用算术运算符和括号将运算对象用算术运算符和括号将运算对象( (也称操作数)连接起来的、符合也称操作数)连接起来的、符合语法规则的式子,称为算术表达式。运算对象包括常量、变量、语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。函数等。 例如例如: : * *.5.5aa是一个合法的表达式是一个合法的表达式3.8算术运算符和算术表达式算术运算符
27、和算术表达式(3)(3)强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。可以利用强制类型转换运算符将一个表达式转换成所需类型。 一般形式一般形式: :(类型名)(表达式)(类型名)(表达式)例如:例如: (double)(double) 将转换成将转换成doubledouble类型类型 ( (int)(x+yint)(x+y) ) 将将x+yx+y的值转换成整型的值转换成整型 (float)(float)(5%35%3) 将将5%35%3的值转换成的值转换成floatfloat型型(4)(4) 自增、自减运算符自增、自减运算符 作用是使变量的值增或减
28、作用是使变量的值增或减如如: ,(在使用之前,先使的值加,(在使用之前,先使的值加 (减)(减),(在使用之后,使的值加(减),(在使用之后,使的值加(减) 3.8 算术运算符和算术表达式算术运算符和算术表达式补充:补充:i+i+与与+i+i的区别:的区别: 是先执行后,再使用的值;是先执行后,再使用的值; 是先使用的值后,再执行。是先使用的值后,再执行。例如:例如: ; i i的值先变成的值先变成4, 4, 再赋给再赋给,j,j的值均为的值均为 ; 先将先将 i i的值的值3 3赋给赋给, ,的值为,然后变为的值为,然后变为 3.8 算术运算符和算术表达式算术运算符和算术表达式注意:注意:
29、(1)(1)自增运算符(),自减运算符(),只能用于变量,自增运算符(),自减运算符(),只能用于变量,而不能用于常量或表达式,而不能用于常量或表达式,(2)(2)和的结合方向是和的结合方向是“自右至左自右至左”。 自增(减)运算符常用于循环语句中使循环变量自动加。也用于指自增(减)运算符常用于循环语句中使循环变量自动加。也用于指针变量,使指针指向下一个地址针变量,使指针指向下一个地址 3.8 算术运算符和算术表达式算术运算符和算术表达式(5) (5) 有关表达式使用中的问题说明有关表达式使用中的问题说明 ANSI CANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译系并没有具
30、体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。统自己安排。 例如例如:对表达式对表达式 a = f1( )+f2( )a = f1( )+f2( ) 并不是所有的编译系统都先调用并不是所有的编译系统都先调用f1( )f1( ), 然后调用然后调用f2( )f2( )。在有的情况下结在有的情况下结果可能不同。有时会出现一些令人容易搞混的问题,因此务必要小心谨慎果可能不同。有时会出现一些令人容易搞混的问题,因此务必要小心谨慎。 语言中有的运算符为一个字符,有的运算符由两个字符组成语言中有的运算符为一个字符,有的运算符由两个字符组成 ,为避免,为避免误解,最好采取大家都能理解的写法。误
31、解,最好采取大家都能理解的写法。 例如例如:不要写成不要写成i+ji+j的形式,而应写成的形式,而应写成(i+)+j(i+)+j的形式的形式 3.8 算术运算符和算术表达式算术运算符和算术表达式在调用函数时,实参数的求值顺序,标准并无统在调用函数时,实参数的求值顺序,标准并无统一规定。一规定。例如:例如:的初值为,如果有下面的函数调用:的初值为,如果有下面的函数调用: printf(,i+) 在有的系统中,从左至右求值,在有的系统中,从左至右求值,输出输出“,”。在多数系统中对函数参数的求值顺序是自右而。在多数系统中对函数参数的求值顺序是自右而左,函数输出的是左,函数输出的是“,”。以上这种写
32、法不宜。以上这种写法不宜提倡,提倡, 最好改写成最好改写成 j = i+;j = i+; printf(%dprintf(%d, %d%d, j j,i)i)不要写出别人看不懂的也不知道系统会怎样执不要写出别人看不懂的也不知道系统会怎样执行程序行程序 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (1)(1)赋值运算符赋值运算符 赋值符号赋值符号“”就是赋值运算符,它的作用是就是赋值运算符,它的作用是将一个数据赋给一个变量将一个数据赋给一个变量。如如“”的作用是把常量赋给变量。的作用是把常量赋给变量。也可以将一个表达式的值赋也可以将一个表达式的值赋给一个变量给一个变量。 (2)(2)类
33、型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。赋值时要进行类型转换。将将浮浮点点型型数数据据(包包括括单单、双双精精度度)赋赋给给整整型型变变量量时时,舍舍弃弃浮浮点点数数的的小小数数部部分。分。如如: :为为整整型型变变量量,执执行行“i=3.56i=3.56”的的结结果果是是使使的的值值为为,以以整整数数形形式式存存储在整型变量中储在整型变量中。3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到将整型数据赋给单、双精度
34、变量时,数值不变,但以浮点数形式存储到变量中变量中。 将一个将一个doubledouble型数据赋给型数据赋给floatfloat变量时,截取其前面变量时,截取其前面7 7位有效数字,存放到位有效数字,存放到floatfloat变量的存储单元(变量的存储单元(4 4个字节)中。但应注意数值范围不能溢出。个字节)中。但应注意数值范围不能溢出。 如如: :float f;double d=123.456789e100; f=d;float f;double d=123.456789e100; f=d;就出现溢出的错误。就出现溢出的错误。 如果将一个如果将一个floatfloat型数据赋给型数据赋给
35、doubledouble变量时,数值不变,有效位数扩展到变量时,数值不变,有效位数扩展到1616位,在内存中以位,在内存中以8 8个字节存储个字节存储字符型数据赋给整型变量时,由于字符只占字符型数据赋给整型变量时,由于字符只占1 1个字节,而整型变量个字节,而整型变量为个字节,因此将字符数据(个二进位)放到整型变量存储单元为个字节,因此将字符数据(个二进位)放到整型变量存储单元的低位中。的低位中。将一个将一个intint、shortshort、longlong型数据赋给一个型数据赋给一个charchar型变量时,只将其低型变量时,只将其低8 8位原封不动地送到位原封不动地送到charchar型
36、变量(即截断)。型变量(即截断)。例如:例如:int i=289;char c=a;c=i; 赋值情况赋值情况 :3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将带符号的整型数据(将带符号的整型数据(intint型)赋给型)赋给longlong型变量时,要进行符号型变量时,要进行符号扩展,将整型数的扩展,将整型数的1616位送到位送到longlong型低型低1616位中位中: :如果如果intint型数据为正值(符号位为),则型数据为正值(符号位为),则longlong型变量的高型变量的高1616位补;位补;如果如果intint型变量
37、为负值(符号位为),则型变量为负值(符号位为),则longlong型变量的高型变量的高1616位补,以保持位补,以保持数值不改变。数值不改变。 反之,若将一个反之,若将一个longlong型数据赋给一个型数据赋给一个intint型变量,只将型变量,只将longlong型数据中低型数据中低1616位原封不动地送到整型变量(即截断)。位原封不动地送到整型变量(即截断)。 将将unsigned unsigned intint型数据赋给型数据赋给long long intint型变量时,不存在符号扩展问题,型变量时,不存在符号扩展问题,只需将高位补即可。将一个只需将高位补即可。将一个unsignedu
38、nsigned类型数据赋给一个占字节数相同的非类型数据赋给一个占字节数相同的非unsignedunsigned型整型变量型整型变量(例如:(例如:unsigned unsigned intint-intint,unsigned long-longunsigned long-long,unsigned unsigned short-shortshort-short),将),将unsignedunsigned型变量的内容原样送到非型变量的内容原样送到非unsignedunsigned型变量中,型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。但如果数据范围超过相应整型的范围,则会出现数
39、据错误。3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (3) (3) 复合的赋值运算符复合的赋值运算符 在赋值符在赋值符“”之前加上其他运算符,可以构成复合的运算符。之前加上其他运算符,可以构成复合的运算符。例如例如: 等价于等价于 * * 等价于等价于 * *()() 等价于等价于 以以“”为例来说为例来说明,它相当于使进行一明,它相当于使进行一次自加()的操作。即次自加()的操作。即先使加,再赋给。先使加,再赋给。 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 为便于记忆,可以这样理解:为便于记忆,可以这样理解: a += b (a += b (其中其中a a为变量,为变量
40、,b b为表达式为表达式) ) a += b a += b(将有下划线的将有下划线的“a+”a+”移到移到“=”=”右侧)右侧) |_|_ a = a + b a = a + b (在在“=”=”左侧补上变量名左侧补上变量名a a) 注意注意: :如果是包含若干项的表达式,则相当于它有括号。如果是包含若干项的表达式,则相当于它有括号。如:如: x %= y+3x %= y+3 x %= (y+3) x %= (y+3) |_ |_ x = x %(y+3)( x = x %(y+3)(不要错写成不要错写成x=x%y+3)x=x%y+3) 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (
41、4) (4) 赋值表达式赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式赋值表达式”。一般形式为一般形式为: 例如例如: “5”5”是一个赋值表达式是一个赋值表达式 对赋值表达式求解的过程是:对赋值表达式求解的过程是: 求赋值运算符右侧的求赋值运算符右侧的“表达式表达式”的值的值; 赋给赋值运算符左侧的变量。赋给赋值运算符左侧的变量。例如例如: 赋值表达式赋值表达式“=3*5”=3*5”的值为的值为1515,执行表达式后,变量,执行表达式后,变量a a的值也是的值也是1515。 3.9 赋值运算符和赋值表达式赋值运
42、算符和赋值表达式 左值左值 ( (lvaluelvalue) ) : 赋值运算符左侧的标识符赋值运算符左侧的标识符变量可以作为左值变量可以作为左值; ;而表达式就不能作为左值而表达式就不能作为左值( (如如a+b);a+b);常变量也不能作为左值。常变量也不能作为左值。 右值右值 ( (lvaluelvalue) ) :出现在赋值运算符右侧的表达式出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。都可以作为右值。 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 赋值表达式中的赋值表达式中的“表达式表达式”,又可
43、以是一个赋值表达式。,又可以是一个赋值表达式。例如例如: : a=(b=5)a=(b=5) 分析分析: :括弧内的括弧内的“b=5”b=5”是一个赋值表达式,它的值等于是一个赋值表达式,它的值等于5 5。执行表达式。执行表达式“a=(b=5)”a=(b=5)”相当于执行相当于执行“b=5”b=5”和和“a ab”b”两个赋值表达式。两个赋值表达式。赋值运算符按照赋值运算符按照“自右而左自右而左”的结合顺序,因此,的结合顺序,因此,“(b(b5)”5)”外面的括弧可以不要,即外面的括弧可以不要,即“a=(b=5)”a=(b=5)”和和“a=b=5”a=b=5”等价。等价。 3.9 赋值运算符和赋
44、值表达式赋值运算符和赋值表达式 请分析下面的赋值表达式请分析下面的赋值表达式(a=3*5)=4*3(a=3*5)=4*3分析分析: :先执行括弧内的运算,将先执行括弧内的运算,将1515赋给赋给a a,然后执行然后执行4*34*3的运算,得的运算,得1212,再把,再把1212赋给赋给a a。最后最后a a的值为的值为1212,整个表达式的值为整个表达式的值为1212。可以看到。可以看到(a=3*5)(a=3*5)出现在赋出现在赋值运算符的左侧,因此赋值表达式值运算符的左侧,因此赋值表达式(a=3*5)(a=3*5)是左值是左值 注意注意: :在对赋值表达式在对赋值表达式(a=3*5)(a=3
45、*5)求解后,变量求解后,变量a a得到值得到值1515执行执行(a=3*5)=4*3(a=3*5)=4*3时,实际上是将时,实际上是将4*34*3的积的积1212赋给变赋给变量量a a,而不是赋给而不是赋给3*53*5。不能写成不能写成:a=3*5=4*3 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 赋值表达式也可以包含复合的赋值运算符。赋值表达式也可以包含复合的赋值运算符。 如:如:a+=a-=a*aa+=a-=a*a分析分析: :此赋值表达式的求解步骤如下此赋值表达式的求解步骤如下 先进行先进行“* *”的运算,的运算, 它相当于它相当于* *,a a的值为的值为1441441
46、32132。再进行再进行“”的运算,相当于的运算,相当于=a+(-132)=a+(-132),a a的值为的值为132-132132-132-264-264。 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。 如:如:printf(%d,a=b); 分析分析: :如果如果b b的值为的值为3 3, 则输出则输出a a的值的值( (也
47、是表达式也是表达式a=ba=b的值的值) )为为3 3。在一。在一个语句中完成了赋值和输出双重功能个语句中完成了赋值和输出双重功能。 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式逗号运算符逗号运算符: :将两个表达式连接起来将两个表达式连接起来, ,又称为又称为“顺序求顺序求值运算符值运算符” 如:如:5 5, 一般形式一般形式: : 表达式,表达式表达式,表达式求解过程:求解过程: 先求解表达式,再求解表达式。整个逗号表达式的值是表达式的值。先求解表达式,再求解表达式。整个逗号表达式的值是表达式的值。 逗号表达式逗号表达式 的的值为值为14 3.10 逗号运算符和逗号表达式逗号运算
48、符和逗号表达式例:例:逗号表达式逗号表达式* *5 5,* * 分析分析: :赋值运算符的优先级别高于逗号运算符,赋值运算符的优先级别高于逗号运算符, 因因 此应先求解此应先求解* *5 5。的值为的值为5,然,然后求解后求解*,得,得。整个逗号。整个逗号表达式的值为表达式的值为。 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式 如如: :(* *,* *) 先计算出的值等于,再进行先计算出的值等于,再进行* *的运算得的运算得6060(但值未变,(但值未变,仍为仍为1515),再进行得,即整个表达式的值为。),再进行得,即整个
49、表达式的值为。 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式逗号表达式的一般形式可以扩展为逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式,表达式,表达式,表达式,表达式 它的值为表达式的值它的值为表达式的值。逗号运算符是所有运算符中级别最低的逗号运算符是所有运算符中级别最低的例例: : (,(,*) ,*3赋值表达式,赋值表达式,将一个逗号表将一个逗号表达式的值赋给达式的值赋给,的值等,的值等于于 逗号表达式,包括一逗号表达式,包括一个赋值表达式和一个个赋值表达式和一个算术表达式,的值算术表达式,的值为,整个逗号表达为,整个逗号表达式的值为式的值为18。 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式注意注意: :并不是任何地方出现的逗号都是作为逗号运算符。并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。例如函数参数也是用逗号来间隔的。 如如: printf(“%d,%d,%d”,a,b,c);“,”并不是一个逗号并不是一个逗号表达式,它是表达式,它是printf函数的函数的3个个参数参数printf(“%d,%d,%d”,(a,b,c),b,c) “(,(,)”是一个是一个逗号表达式,逗号表达式,它的值等于它的值等于的值。的值。