kj-第2章数据类型、运算符和表达式ppt课件(全).ppt
第第2章章 数据类型、运算符与表达式数据类型、运算符与表达式 本章概述 本章的学习目标主要内容1本章概述本章概述l本本章章主主要要介介绍绍C程程序序中中经经常常用用到到的的常常量量、变变量量、基基本本数数据据类类型型(整整型型、实实型型、字字符符型型)、运运算算符符(算算术术运运算算符符、赋赋值值运运算算符符、强强制制类类型型转转换换运运算算符符、自自增增自自减减运运算算符符、逗逗号号运运算算符符、求求字字节节运运算算符符)、表表达达式式(算算术术表表达达式式、赋赋值值表表达达式式、逗逗号号表表达达式式)等等内容。内容。2本章的学习目标本章的学习目标l本章教学目的:l 掌握整型、实型和字符型常量、变量的基本使用方法,掌握变量赋初值方法、混合运算规则、算术运算符和表达式的用法,理解赋值表达式和逗号表达式。l本章教学重点:l 整型、实型和字符型常量、变量的基本使用方法,算术运算符和表达式的用法l本章教学难点:l 混合运算规则、赋值表达式和逗号表达式3主要内容主要内容l2.1 C语言的数据类型语言的数据类型 l2.2 常量和变量常量和变量 l2.3 整型数据整型数据l2.4 实型数据实型数据 l2.5 字符型数据字符型数据l2.6 算术运算符和算术表达式算术运算符和算术表达式l2.7 赋值运算符和赋值表达式赋值运算符和赋值表达式l2.8 其它运算符和表达式其它运算符和表达式 42.1 C语言的数据类型语言的数据类型 52.2 常量和变量常量和变量 2.2.1 常量常量l在程序运行过程中,其值不能被改变的量称为常量。在程序运行过程中,其值不能被改变的量称为常量。l常量分为:常量分为:l(1)整型常量(如)整型常量(如369、0、-547););l(2)实型常量(如)实型常量(如2.71828、-9.8、3.14159););l(3)字符常量(如)字符常量(如A、a、#、3););l(4)符号常量)符号常量用一个标识符代表一个常量。例如若用一个标识符代表一个常量。例如若在程序开始有这样的预处理命令:在程序开始有这样的预处理命令:“#define N 10”,那,那么么C预处理程序会将程序中所有的预处理程序会将程序中所有的N用用10代替。代替。6l2.2.2 变量变量l在程序运行过程中,其值可以被改变的量称为变在程序运行过程中,其值可以被改变的量称为变量。量。l在使用一个变量前,必须先定义该变量,就是为在使用一个变量前,必须先定义该变量,就是为该变量起个名字并声明它的数据类型。根据定义,该变量起个名字并声明它的数据类型。根据定义,编译系统在内存中为该变量分配存储单元,在该编译系统在内存中为该变量分配存储单元,在该存储单元中存放该变量的值。存储单元中存放该变量的值。l用来标识变量名(或符号常量名、函数名、数组用来标识变量名(或符号常量名、函数名、数组名、类型名、文件名)的有效字符序列称为标识名、类型名、文件名)的有效字符序列称为标识符。符。C语言规定,标识符只能由英文字母、数字、语言规定,标识符只能由英文字母、数字、下划线三种字符组成,并且第一个字符必须是字下划线三种字符组成,并且第一个字符必须是字母或下划线。母或下划线。7l注意,大写英文字母和小写英文字母是不同的字符,注意,大写英文字母和小写英文字母是不同的字符,例如例如aver和和Aver是两个不同的标识符。为变量起名是两个不同的标识符。为变量起名字时一般用小写英文字母。字时一般用小写英文字母。l变量定义的一般格式:变量定义的一般格式:l 存储类型存储类型 数据类型数据类型 变量名变量名1,变量名变量名2;l例如:例如:int a,b,number,sum;l称在定义变量的同时对变量进行赋初值的操作为变量称在定义变量的同时对变量进行赋初值的操作为变量初始化。初始化。l变量初始化的一般格式:变量初始化的一般格式:l存储类型存储类型 数据类型数据类型 变量名变量名1=初值初值1,变量名变量名2=初值初值2;l例如:例如:float radius=2.5,length=3.6,area;82.3 整型数据整型数据l整型常量即整常数,在语言中,整型常量可整型常量即整常数,在语言中,整型常量可用三种形式表示:用三种形式表示:l(1)十进制,例如)十进制,例如456、0、-789。l(2)八进制(以数字开头),例如)八进制(以数字开头),例如0123,即即(123)8,等于十进制的等于十进制的83。l(3)十六进制(以数字)十六进制(以数字+小写字母小写字母x开头)开头),例如例如0 x23,即即(23)16,等于十进制的等于十进制的35。l2.3.1 整型常量整型常量9l2.3.2 整型变量整型变量l根据变量的取值范围,整型变量可分为:基本整型(类型关键字根据变量的取值范围,整型变量可分为:基本整型(类型关键字为为int)、短整型(类型关键字为)、短整型(类型关键字为short int)、长整型(类型关)、长整型(类型关键字为键字为long int)。)。l对以上三种都可以加上修饰符对以上三种都可以加上修饰符unsigned,指定是,指定是“无符号数无符号数”。不加修饰符不加修饰符unsigned的,隐含是有符号(的,隐含是有符号(signed)。即有符号)。即有符号的,的,signed可以省略不写。可以省略不写。l归纳起来,整型变量有以下归纳起来,整型变量有以下6种:种:l有符号基本整型有符号基本整型 signed intl无符号基本整型无符号基本整型 unsigned intl有符号短整型有符号短整型 signed short intl无符号短整型无符号短整型 unsigned short intl有符号长整型有符号长整型 signed long intl无符号长整型无符号长整型 unsigned long intl(方括弧内的部分可以省略,如(方括弧内的部分可以省略,如unsigned long int与与unsigned long等价。)等价。)10l数据在内存中是以二进制形式存放的。若数据在内存中是以二进制形式存放的。若不指定是无符号型不指定是无符号型unsigned或指定是有符或指定是有符号型号型signed,则存储单元的最高位是符号,则存储单元的最高位是符号位(位(0为正,为正,1为负)。为负)。l若指定是无符号型若指定是无符号型unsigned,则存储单元,则存储单元的全部二进制位(的全部二进制位(bit)都用来存放数本身,)都用来存放数本身,而不包括符号。而不包括符号。11lC标准没有具体规定以上各类数据所占内存大小,只要求标准没有具体规定以上各类数据所占内存大小,只要求long型数据不短于型数据不短于int型,型,short型不长于型不长于int型,怎样实现型,怎样实现由计算机系统自行决定。例如在微机上,由计算机系统自行决定。例如在微机上,short和和int型占型占2个字节,个字节,long型占型占4个字节。个字节。l表表2.1列出了列出了ANSI标准定义的各种整数类型和有关数据,标准定义的各种整数类型和有关数据,其中其中“最小取值范围最小取值范围”是指不能低于此值,但可高于此值,是指不能低于此值,但可高于此值,如有的如有的C编译系统规定一个编译系统规定一个int型数据占型数据占4个字节。个字节。表表2.1 ANSI2.1 ANSI标标准定准定义义的各种整数的各种整数类类型和有关数据型和有关数据类型字节数最小取值范围signed intunsigned intsigned short intunsigned short intsigned long int unsigned long int222244-3276832767 即 215(215-1)065535 即 0(216-1)-3276832767 即 215(215-1)065535 即 0(216-1)-21474836482147483647 即 231(231-1)04294967295 即 0(232-1)12l2.3.3 整型数据的输入输出整型数据的输入输出l可以使用可以使用scanf函数和函数和printf函数进行数据的输入输出。函数进行数据的输入输出。lscanf函数的功能是按照指定格式将标准输入设备输入的函数的功能是按照指定格式将标准输入设备输入的内容送入变量中,内容送入变量中,printf函数的功能是按照指定格式在标函数的功能是按照指定格式在标准输出设备上显示数据。准输出设备上显示数据。“指定格式指定格式”需要使用格式说明需要使用格式说明符符%和格式字符,显示整型数的格式字符有英文字母和格式字符,显示整型数的格式字符有英文字母d、o、x、u等。等。l具体含义如下:具体含义如下:l%d表示把数据按十进制整型输入(输出);表示把数据按十进制整型输入(输出);l%o表示把数据按八进制整型输入(输出);表示把数据按八进制整型输入(输出);l%x表示把数据按十六进制整型输入(输出);表示把数据按十六进制整型输入(输出);l%u表示把数据按无符号整型输入(输出)。表示把数据按无符号整型输入(输出)。l除了除了%d格式之外,上面的其余几种格式都将数据作为无符格式之外,上面的其余几种格式都将数据作为无符号数输入(输出)。号数输入(输出)。l如果输入(输出)的是长整型数,一定要在转换字符的前如果输入(输出)的是长整型数,一定要在转换字符的前面加字符面加字符l(字符(字符L的小写),否则显示可能不对。的小写),否则显示可能不对。13例例2.1 整型数据的输出。整型数据的输出。l#include lint main()l int a=200,b=100,c;l c=a+b+15;l printf(%d,%d,%d,%dn,a,b,c,a-b-70);l printf(%o,%o,%o,%on,a,b,c,a-b-70);l printf(%x,%x,%x,%xn,a,b,c,a-b-70);l return 0;ll运行结果如下:运行结果如下:l200,100,315,30l310,144,473,36lC8,64,13b,1e14l#include lint main()l int a,b,c;unsigned d;long e;l scanf(%d,%o,%x,%u,%ld,&a,&b,&c,&d,&e);l printf(%d,%d,%d,%u,%ld n,a,b,c,d,e);l return 0;ll若输入为:若输入为:l10,10,10,65533,654321 (回车符)(回车符)l显示结果为:显示结果为:l10,8,16,65533,654321 例例2.2 整型数据的输入。整型数据的输入。152.4 实型数据实型数据2.4.1 实型常量实型常量l实数又称浮点数,有两种表示形式:实数又称浮点数,有两种表示形式:l(1)十进制小数形式:由数字和小数点组成,必须有)十进制小数形式:由数字和小数点组成,必须有小数点,例如小数点,例如3.14159、0.0、9.0、.12345、-9.8等。等。l(2)指数形式:)指数形式:E(或(或e)。例如。例如1.23E3、2.71e-5(分别代表(分别代表1.23 103、2.71 10-5)等。注意:等。注意:E(或(或e)的两边必须有数字,且后面的指数)的两边必须有数字,且后面的指数必须是整数。必须是整数。l一个实数有多种指数表示形式。例如一个实数有多种指数表示形式。例如314.159可以表示可以表示为为3141.59E-1、314.159E0、3.14159E2、0.314159E3等,把其中的等,把其中的3.14159E2称为称为“规范化的规范化的指数形式指数形式”,即小数点左边有且只有一位非零数字。,即小数点左边有且只有一位非零数字。16l实型变量分为单精度型和双精度型,有的实型变量分为单精度型和双精度型,有的C版本还支持长双版本还支持长双精度型精度型(long double)。l(1)单精度型。类型说明符为)单精度型。类型说明符为float,在内存中占个字节,在内存中占个字节(32位),有效数字的个数是位十进制数字,数值范围位),有效数字的个数是位十进制数字,数值范围-3.410-383.4 1038。l(2)双精度型。类型说明符为)双精度型。类型说明符为double,在内存中占个字,在内存中占个字节(节(64位),有效数字的个数是位),有效数字的个数是15位十进制数字,数值范围位十进制数字,数值范围-1.710-3081.7 10308。l2.4.2 实型变量实型变量172.4.3 实型数据的输入输出实型数据的输入输出l可以使用可以使用%f和和%e控制输入(输出)控制输入(输出)float类型的数据,类型的数据,l可以使用可以使用%lf和和%le控制输入(输出)控制输入(输出)double类型的数据。类型的数据。18例例2.3 实型数据的输入输出。实型数据的输入输出。l#include lint main()l float a,b;double x,y;l scanf(%f,%e,%lf,%le,&a,&b,&x,&y);l printf(%f,%e,%lf,%le n,a,b,x,y);l return 0;ll若输入为:若输入为:l3.1415,314.15,123.456,12345.6 (回车符)(回车符)l显示结果为:显示结果为:l3.141500,3.14150e+02,123.456000,1.23456e+04l若输入为:若输入为:l3.1415926,666.666666,123456789.123456789,123456.7898765 l显示结果为:显示结果为:l3.141593,6.66667e+02,123456789.123457,1.23457e+05 从从显示可见:对于十显示可见:对于十进制小数形式,单精度型进制小数形式,单精度型和双精度型的有效数字分和双精度型的有效数字分别是别是7位和位和15位。对于十位。对于十进制指数形式,都是进制指数形式,都是6位位有效数字。有效数字。19lC的字符型常量是用一对单引号括起来的单个字符,例如,的字符型常量是用一对单引号括起来的单个字符,例如,A、3、a、?等都是字符型常量。注意等都是字符型常量。注意A和和a是不同的。是不同的。l还有一种特殊形式的字符型常量,就是以转义符还有一种特殊形式的字符型常量,就是以转义符“”开开头的一些字符构成的转义序列。例如头的一些字符构成的转义序列。例如n表示表示“回车换回车换行行”。常见的转义字符如表。常见的转义字符如表2.2所示。所示。l表中表中ddd表示表示1到到3位位8进制数所代表的字符,例如进制数所代表的字符,例如101代表字符代表字符A,77代表字符代表字符?,43代表字符代表字符#。l表中表中xhh表示表示1到到2位位16进制数所代表的字符,例如进制数所代表的字符,例如x61代表字符代表字符a,x23代表字符代表字符#。l表中表中t表示横向跳格,跳到下一个制表位置,一个制表区表示横向跳格,跳到下一个制表位置,一个制表区占占8列,执行列,执行t就是将当前位置跳到下一个制表区的就是将当前位置跳到下一个制表区的开头。开头。2.5 字符型数据字符型数据2.5.1 字符型常量字符型常量20表表2.2 常见转义字符及其含义常见转义字符及其含义字符形式含义abfnrt”dddxhh0警告声退格,将当前位置移到前一列换页,将当前位置移到下一页开头换行,将当前位置移到下一行开头回车,将当前位置移到本行开头横向跳格,跳到下一个tab位置反斜线字符单撇号字符双撇号字符1到3位8进制数所代表的字符1到2位16进制数所代表的字符字符串终止字符21例例2.4 转义字符的使用转义字符的使用l#include lint main()l printf(A102x43DEtbbx2343x61x62n);lprintf(A53101tb43141142x63bx64n);l return 0;ll显示结果为:显示结果为:l ABCDE#abl A+“A”#abd 222.5.2 字符串常量字符串常量l字符串常量是用一对双引号括起来的若干字符序字符串常量是用一对双引号括起来的若干字符序列。例如:列。例如:“How are you”,“No.345”。lC编译程序在存储字符串常量时自动采用字符编译程序在存储字符串常量时自动采用字符0作为字符串结束标志,字符作为字符串结束标志,字符0的的ASCII码值为码值为0,它不引起任何控制动作,也不是,它不引起任何控制动作,也不是一个可显示的字符。一个可显示的字符。l因此,字符串因此,字符串“Good”在内存中要占在内存中要占5个字节数,个字节数,而不是而不是4个。个。l注意:注意:A和和“A”是不同的,是不同的,A是字符常量,是字符常量,在内存占在内存占1个字节数;个字节数;“A”字符串常量,在内存字符串常量,在内存占占2个字节数,包含个字节数,包含A和和0两个字符。两个字符。232.5.3 字符型变量字符型变量l字符变量的类型说明符为字符变量的类型说明符为char,例如:,例如:“char c1,c2;”表示定义了两个字符变量。表示定义了两个字符变量。l字符变量用来存储字符常量,一个字符变量只能存储字符变量用来存储字符常量,一个字符变量只能存储1个个字符,即只能存储字符,即只能存储1个字节的信息,就是说一个字符变量个字节的信息,就是说一个字符变量在内存中占一个字节。例如用如下语句给上面定义的字符在内存中占一个字节。例如用如下语句给上面定义的字符变量变量c1、c2赋值:赋值:lc1=A;c2=B;l将一个字符常量放到一个字符变量中,实质上是将该字符将一个字符常量放到一个字符变量中,实质上是将该字符常量对应的常量对应的ASCII代码放到了字符变量中,系统为字符变代码放到了字符变量中,系统为字符变量所分配的一个字节的存储单元中,存放的是该字符常量量所分配的一个字节的存储单元中,存放的是该字符常量的二进制形式的的二进制形式的ASCII代码,例如代码,例如A的的ASCII代码是代码是65,65的二进制形式是的二进制形式是01000001,所以系统为,所以系统为c1所分配的所分配的一个字节中,存放的是一个字节中,存放的是01000001。242.5.4 字符数据的输入输出字符数据的输入输出l可以使用可以使用%c控制输入(输出)控制输入(输出)char类型的数据。类型的数据。l例例2.5 字符变量值的输入输出。字符变量值的输入输出。l#include lint main()l char c1,c2,c3=P;l scanf(%c,&c1);l c2=D;l printf(%c%c%c,c1,c2,c3);l printf(,%c,%c,%c n ,c1,c2,c3);l return 0;l若输入为:若输入为:G 输出结果为:输出结果为:GDP,G,D,P 25例例2.6 将大写英文字符转换为小写英文字符。将大写英文字符转换为小写英文字符。l#include lint main()l char c1,c2;l printf(请输入请输入2个两个大写英文字符:个两个大写英文字符:);l scanf(%c,%c,&c1,&c2);l printf(%c%c ,c1,c2);l c1=c1+32;c2=c2+32;l printf(%c,%cn ,c1,c2);l return 0;l若输入为:若输入为:A,B 输出结果为:输出结果为:AB a,b 262.6 算术运算符和算术表达式算术运算符和算术表达式2.6.1 算术运算符算术运算符l基本的算术运算符有如下五种:基本的算术运算符有如下五种:l+(加法运算符、或正值运算符,如(加法运算符、或正值运算符,如13+25、+9););l-(减法运算符、或负值运算符,如(减法运算符、或负值运算符,如32-15、-2););l*(乘法运算符,如(乘法运算符,如4*7、5.6*7.8););l/(除法运算符,如(除法运算符,如32/5、1.23/3.45););l%(求余数运算符,或称取模运算符,如(求余数运算符,或称取模运算符,如8%5的值为的值为3)。)。27l关于除法运算符关于除法运算符/:l若是两个整数相除,其商为整数,小数部分被舍弃。例如,若是两个整数相除,其商为整数,小数部分被舍弃。例如,5/2的结果不是的结果不是2.5,而是,而是2;12/24的结果是的结果是0。若除数和。若除数和被除数中有一个是浮点数(实数),则与数学的运算规则被除数中有一个是浮点数(实数),则与数学的运算规则相同,例如相同,例如6/4.0、6.0/4、6.0/4.0的结果都是的结果都是1.5。l关于求余数运算符:关于求余数运算符:l要求两侧的操作数均为整型数据,结果的符号与要求两侧的操作数均为整型数据,结果的符号与%左边的左边的符号相同。例如符号相同。例如16%4的结果是的结果是0,-17%4的结果是的结果是-1,18%-4的结果是的结果是2,-19%-4的结果是的结果是-3。可以利用。可以利用%运算运算来判断一个数能否被另一个数整除。来判断一个数能否被另一个数整除。282.6.2 算术表达式算术表达式l(1)算术表达式的概念)算术表达式的概念l用算术运算符和圆括号将运算对象(常量、变量和函数等)用算术运算符和圆括号将运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子,称为连接起来的、符合语言语法规则的式子,称为C算术表算术表达式。达式。l单个常量、变量或函数,可以看作是表达式的一种特例。单个常量、变量或函数,可以看作是表达式的一种特例。l例如数学表达式(例如数学表达式(2x+3y)(4xy),写成语言的算),写成语言的算术表达式,应该是:术表达式,应该是:l(2*x+3*y)/(4*x*y),或(),或(2*x+3*y)/4/x/y,不能是,不能是(2x+3y)/(4xy),),l也不能是也不能是2*x+3*y/(4*x*y),),l也不能是(也不能是(2*x+3*y)/4*x*y。29l算术表达式的结果不应超过其能表示的数的范围。例如算术表达式的结果不应超过其能表示的数的范围。例如int型数的范围是型数的范围是-32768至至32767,下面程序中的算术表达式,下面程序中的算术表达式x+y超过了超过了32767,赋给,赋给z显然是错的。显然是错的。lmain()()l int x,y,z;l x=31500;y=24600;l z=x+y;l printf(“%d”,z);ll若将若将x、y和和z定义为定义为long型,就没有问题了。型,就没有问题了。30l(2)算术运算符的优先级与结合性)算术运算符的优先级与结合性l表达式求值时,按运算符的优先级别高低,按次序执行。表达式求值时,按运算符的优先级别高低,按次序执行。算术运算符的优先级是:先乘除,后加减;求余数运算的算术运算符的优先级是:先乘除,后加减;求余数运算的优先级与乘除相同;函数和圆括号的优先级最高。优先级与乘除相同;函数和圆括号的优先级最高。l所谓结合性是指:当一个操作数两侧的运算符具有相同的所谓结合性是指:当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合?自左至右的结合方向,称为左结合性。右边的运算符结合?自左至右的结合方向,称为左结合性。反之,称为右结合性。反之,称为右结合性。l算术运算符的结合方向是算术运算符的结合方向是“自左至右自左至右”,例如:在执行,例如:在执行“ab+c”时,变量时,变量b先与减号结合,执行先与减号结合,执行“ab”;然后;然后再执行加再执行加c的运算。的运算。312.6.3 不同数据类型间的混合运算不同数据类型间的混合运算l在语言中,整型、实型和字符型数据间在语言中,整型、实型和字符型数据间可以混合运算。可以混合运算。l如果一个运算符两侧的操作数的数据类型如果一个运算符两侧的操作数的数据类型不同,则系统按不同,则系统按“先转换、后运算先转换、后运算”的原的原则,首先将数据自动转换成同一类型,然则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。后在同一类型数据间进行运算。l有两种转换方式:有两种转换方式:自动转换和强制转换自动转换和强制转换。321自动转换自动转换l自动转换就是系统根据规则自动地将两个不同数据自动转换就是系统根据规则自动地将两个不同数据类型的运算对象转换成同一数据类型。自动转换又类型的运算对象转换成同一数据类型。自动转换又称为隐式转换。自动转换的规则如图称为隐式转换。自动转换的规则如图2.1所示。所示。图图2.1中,横向向右的箭头表示的是必须的转换。中,横向向右的箭头表示的是必须的转换。char和和short 型必须转换型必须转换成成int型参与运算,型参与运算,float型必须转换成型必须转换成double型参与运算(即使是两个型参与运算(即使是两个float型型数据相加,也要先转换成数据相加,也要先转换成double型,然后再相加)。型,然后再相加)。图图2.1中,纵向箭头表示的是当运算对象为不同类型时转换的方向。例如,中,纵向箭头表示的是当运算对象为不同类型时转换的方向。例如,若若int型与型与double型数据进行混合运算,则先将型数据进行混合运算,则先将int型数据转换成型数据转换成double型,然型,然后进行运算,结果为后进行运算,结果为double型。纵向箭头的方向只是表示数据类型的高低,由型。纵向箭头的方向只是表示数据类型的高低,由低向高转换,不要理解为低向高转换,不要理解为int型先转换成型先转换成unsigned型,然后再转换成型,然后再转换成long型,型,然后再转换成然后再转换成double型。型。图图2.133注意:注意:l自动转换只是针对一个运算符两侧的两个运算对自动转换只是针对一个运算符两侧的两个运算对象,不能对表达式中的所有运算符涉及到的运算象,不能对表达式中的所有运算符涉及到的运算对象做一次性的自动转换。对象做一次性的自动转换。l例如,表达式例如,表达式6.0/5+4.32和表达式和表达式6/5+4.32,l前者的值是前者的值是5.52,后者的值是,后者的值是5.32。l因为因为6.0/5是先将是先将5转换成实型后进行运算,值是转换成实型后进行运算,值是1.2,再与,再与4.32相加,值是相加,值是5.52。l而而6/5是按是按int型运算,值是型运算,值是1,再与,再与4.32相加,值相加,值是是5.32;l不要理解成将不要理解成将6/5+4.32中的每个数全部转换成实中的每个数全部转换成实型后再运算。型后再运算。342强制转换强制转换l编写程序时,可以利用强制类型转换运算符将一个表达式的编写程序时,可以利用强制类型转换运算符将一个表达式的值转换成所需类型,强制转换的格式为:值转换成所需类型,强制转换的格式为:l (类型名)(表达式)(类型名)(表达式)l例如:例如:l(float)al将将a转换成转换成float型。注意不能写成型。注意不能写成float(a)。)。l(int)3.45l将将3.45转换成转换成int型。型。l(double)(7%6)l将将7%6的值转换成的值转换成double型。型。l(float)(x+y)l将将x+y的值转换成的值转换成float型。注意不能写成(型。注意不能写成(float)x+y。352.7 赋值运算符和赋值表达式赋值运算符和赋值表达式2.7.1 赋值运算符赋值运算符l1普通赋值运算符普通赋值运算符l普通赋值运算符就是普通赋值运算符就是“=”,它的作用是将运,它的作用是将运算符右侧表达式的值赋给运算符左侧的变量。算符右侧表达式的值赋给运算符左侧的变量。l例如例如“x=1.23”的作用是将常量的作用是将常量1.23赋给变量赋给变量x,“y=3*x+5.26”的作用是将表达式的作用是将表达式3*x+5.26的值赋给变量的值赋给变量y。l例如例如“x=x+1”的作用是:将变量的作用是:将变量x原来的值加原来的值加1后再赋给变量后再赋给变量x,若变量,若变量x原来的值是原来的值是2,则,则执行执行“x=x+1”后,变量后,变量x的值是的值是3。362复合赋值运算符复合赋值运算符l复合赋值运算符是在普通赋值运算符复合赋值运算符是在普通赋值运算符“=”的前面加的前面加上其它运算符,复合算术赋值运算符有如下上其它运算符,复合算术赋值运算符有如下5个:个:l+=、-=、*=、/=、%=l另外还有另外还有5种复合赋值运算符(种复合赋值运算符(=、&=、=、|=),将在后面其它章中介绍。),将在后面其它章中介绍。l复合算术赋值运算符的使用规则为:复合算术赋值运算符的使用规则为:Xop=Y等价于等价于X=XopY,其中,其中X代表被赋值的某个变量,代表被赋值的某个变量,op代表代表+或或-或或*或或/或或%,Y代表某个表达式。例如:代表某个表达式。例如:la+=9 等价于等价于 a=a+9lb*=c+5 等价于等价于 b=b*(c+5)l(注意不等价于(注意不等价于b=b*c+5)ld/=2*e-7 等价于等价于 d=d/(2*e-7)l(注意不等价于(注意不等价于d=d/2*e-7)372.7.2 赋值表达式赋值表达式l由变量、赋值运算符和表达式连接起来的式子称由变量、赋值运算符和表达式连接起来的式子称为赋值表达式。赋值表达式的值就是被赋值的变为赋值表达式。赋值表达式的值就是被赋值的变量的值。量的值。l例如,例如,a=123是一个赋值表达式,是一个赋值表达式,a=123这个赋值这个赋值表达式的值就是表达式的值就是a的值,而的值,而a的值是的值是123,所以,所以a=123这个赋值表达式的值就是这个赋值表达式的值就是123。l例如,例如,b+=456也是一个赋值表达式,也是一个赋值表达式,b+=456这这个赋值表达式的值就是个赋值表达式的值就是b的值,因为的值,因为b+=456等价等价于于b=b+456,若,若b的初值是的初值是300,则执行,则执行b=b+456后,后,b的值是的值是756,所以,所以b+=456这个赋值表达式这个赋值表达式的值就是的值就是756。38下面是赋值表达式的其它几个例子:下面是赋值表达式的其它几个例子:lx=(y=23)+(z=17)-8l(x的值是的值是32,所以赋值表达式的值是,所以赋值表达式的值是32)lx/=8*(y=2)l(若(若x的初值是的初值是32,执行,执行x/=8*(y=2)后,后,x的值是的值是2,所以赋值表达,所以赋值表达式的值是式的值是2)ly1=y2=y3=8l(执行(执行y1=y2=y3=8后,后,y1、y2、y3的值都是的值都是8,所以赋值表达式,所以赋值表达式的值是的值是8)l赋值表达式的后面加上分号(;),就成为赋值语句。赋值表达式的后面加上分号(;),就成为赋值语句。l赋值表达式也可以在赋值语句之外的其它语句中出现。例如:赋值表达式也可以在赋值语句之外的其它语句中出现。例如:lif(ch=getchar())!=n)printf(“%c”,ch);l上面语句中出现了赋值表达式上面语句中出现了赋值表达式“ch=getchar()”(函数(函数getchar()会在后面第会在后面第3章中详细介绍),章中详细介绍),ch的值就是赋值表达式的值就是赋值表达式ch=getchar()的值,若该值不等于的值,若该值不等于n,则输出,则输出ch的值。的值。392.7.3 赋值表达式的类型转换赋值表达式的类型转换l当赋值运算符左边的变量数据类型与右边的表达式的当赋值运算符左边的变量数据类型与右边的表达式的数据类型不相同时,需要进行数据类型的转换,系统数据类型不相同时,需要进行数据类型的转换,系统把右边的数据转换成左边数据类型的数据。把右边的数据转换成左边数据类型的数据。l转换后可能会发生数据丢失现象。转换后可能会发生数据丢失现象。l例如,左边为例如,左边为int型,右边为型,右边为long型,由于型,由于long型在内型在内存中所占二进制位数(存中所占二进制位数(32位)大于位)大于int型在内存中所占型在内存中所占二进制位数(二进制位数(16位),造成位),造成long型的高型的高16位无法复制位无法复制到到int型变量中去,因此可能丢失数据。同理,左边为型变量中去,因此可能丢失数据。同理,左边为float型,右边为型,右边为double型,也可能丢失数据。型,也可能丢失数据。l下面分几种情况讨论:下面分几种情况讨论:401整型和字符型之间的转换整型和字符型之间的转换l(1)字符型数据赋给整型变量)字符型数据赋给整型变量l由于字符型数据在内存中占由于字符型数据在内存中占8位,而整型变量在内位,而整型变量在内存中占存中占16位,因此将字符型数据的位,因此将字符型数据的8位放到整型变位放到整型变量的低量的低8位中。对整型变量高位中。对整型变量高8位的处理:有的系位的处理:有的系统是对整型变量高统是对整型变量高8位补位补0;有的系统是根据字符;有的系统是根据字符型数据的最高位的值来决定补型数据的最高位的值来决定补1还是补还是补0。l例如例如Turbo C是根据字符型数据的最高位的值来是根据字符型数据的最高位的值来决定补决定补1还是补还是补0。若字符型数据的最高位值为。若字符型数据的最高位值为0,则对整型变量高,则对整型变量高8位补位补0;若字符型数据的最高;若字符型数据的最高位值为位值为1,则对整型变量高,则对整型变量高8位补位补1。41(2)整型()整型(int或或short或或long)数据赋给字符型变量)数据赋给字符型变量l由于字符型数据在内存中占由于字符型数据在内存中占8位,所以只将整型数据的低位,所以只将整型数据的低8位送到字符型变量中。位送到字符型变量中。l例如,若将十进制例如,若将十进制int型数据型数据322赋给字符型变量赋给字符型变量ch,因为,因为322的二进制形式是的二进制形式是0000000101000010,它的低,它的低8位是位是01000010(十进制形式是十进制形式是66),所以字符型变量,所以字符型变量ch的值的的值的二进制形式是二进制形式是01000010(即(即66),若执行),若执行“printf(“%c”,ch););”语句则输出字符语句则输出字符B,因,因为为B的的ASCII码是码是66(十进制)。(十进制)。l例如,若将十进制例如,若将十进制int型数据型数据65赋给字符型变量赋给字符型变量ch,因为,因为65的二进制形式是的二进制形式是0000000001000001,它的低,它的低8位是位是01000001(十进制形式也是十进制形式也是65),所以字符型变量,所以字符型变量ch的值的值的二进制形式是的二进制形式是01000001,若执行,若执行“printf(”%c”,ch););”语句则输出字符语句则输出字符A。422整型之间的转换整型之间的转换l(1)int型数据赋给型数据赋给long型变量型变量l将将int型数据的型数据的16位二进制代码送到位二进制代码送到long型变量的型变量的低低16位中,如果位中,如果int型数据值为正(符号位是型数据值为正(符号位是0),),则则long型变量的高型变量的高16位补位补0;如果;如果int型数据值为型数据值为负(符号位是负(符号位是1),则),则long型变量的高型变量的高16位补位补1。高高16位补位补0或或1称为符号扩展。称为符号扩展。l(2)long型数据赋给型数据赋给int型变量型变量l只将只将long型数据中的低型数据中的低16位送到位送到int型变量中。型变量中。l(3)unsigned int型数据赋给型数据赋给long int型变量型变量l此时不存在符号扩展问题,只需将此时不存在符号扩展问题,只需将long int型变量型变量的高位补的高位补0即可。即可。43l(4)unsigned型数据赋给占二进制位数相同的其它整型型数据赋给占二进制位数相同的其它整型变量变量l将将uns