计算机C语言程序设计数据类型.ppt

上传人:工**** 文档编号:576832195 上传时间:2024-08-20 格式:PPT 页数:78 大小:452.55KB
返回 下载 相关 举报
计算机C语言程序设计数据类型.ppt_第1页
第1页 / 共78页
计算机C语言程序设计数据类型.ppt_第2页
第2页 / 共78页
计算机C语言程序设计数据类型.ppt_第3页
第3页 / 共78页
计算机C语言程序设计数据类型.ppt_第4页
第4页 / 共78页
计算机C语言程序设计数据类型.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《计算机C语言程序设计数据类型.ppt》由会员分享,可在线阅读,更多相关《计算机C语言程序设计数据类型.ppt(78页珍藏版)》请在金锄头文库上搜索。

1、第三章第三章l l 主要内容3.1 C的数据类型3.2 常量与变量3.3 整型数据3.4 浮点型数据运行3.5 字符型数据 l l 主要内容3.变量赋初值 3.7 各类数值型数据间的混合运算 3.8 算术运算符和算术表达式 3.9 赋值运算符和赋值表达式 3.10 逗号运算符和逗号表达式 3.1 C 3.1 C的数据类型的数据类型C C语言提供了以下一些数据类型。语言提供了以下一些数据类型。 数据类型数据类型构造类型构造类型指针类型指针类型空类型(空类型(无值类型)无值类型) voidvoid枚举类型枚举类型枚举类型枚举类型 enumenumenumenum数组类型数组类型数组类型数组类型结构

2、类型结构类型结构类型结构类型 structstructstructstruct联合类型联合类型联合类型联合类型 unionunionunionunion基本类型基本类型整型整型整型整型 intintintint字符型字符型字符型字符型 charcharcharchar实型(浮点型)实型(浮点型)实型(浮点型)实型(浮点型)单精度实型单精度实型单精度实型单精度实型 floatfloatfloatfloat双精度实型双精度实型双精度实型双精度实型 doubledouble 3.2 3.2 常量与变量常量与变量3.2.1 常量和符号常量在程序运行过程中在程序运行过程中, ,其值不能被改变的量称为其值

3、不能被改变的量称为常量常量常量区分为不同的类型:常量区分为不同的类型:整型 100,125,-100,0实型 3.14 , 0.125,-3.789字符型 a, b,2字符串 “a”, “ab”, “ 1232 ”符号常量 #define PI 3.14159例例3.1 符号常量的使用符号常量的使用#define PRICE 30#include void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total);说明:说明: 程序中用程序中用#define#define命令行定义命令行定义PRICE

4、PRICE代表常量代表常量30,30,此后凡在本文件中出现的此后凡在本文件中出现的PRICEPRICE都代表都代表30,30,可以和常量一样进行运算可以和常量一样进行运算说明:说明:用一个标识符代表一个常量的用一个标识符代表一个常量的, ,称为符称为符号常量号常量, ,即以标识符形式出现的常量。符号即以标识符形式出现的常量。符号常量的值在其作用域常量的值在其作用域( (在本例中为主函数在本例中为主函数) )内不能改变内不能改变, ,也不能再被赋值。也不能再被赋值。 说明:说明:如再用赋值语句给如再用赋值语句给PRICEPRICE赋值是错误赋值是错误的。的。 PRICE=40;PRICE=40;

5、 /* /* 错误,不能给符错误,不能给符号常量赋值。号常量赋值。 运行结果: total=300 3.2 3.2 常量与变量常量与变量3.2.2变量变量代表内存中具有特定属性的一个存储单变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。程序运行期间,这些值是可以改变的。变量名实际上是一个以一个名字对应代表一变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量每一个变量名分配对应的内存地址。从变量中

6、取值,实际上是通过变量名找到相应的内中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。存地址,从该存储单元中读取数据。 3.2 3.2 常量与变量常量与变量 变量命名的规定:变量命名的规定:语言规定标识符只能由语言规定标识符只能由字母、数字和下划线三种字符组成,且第一字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。个字符必须为字母或下划线。 例:sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John, ¥123,3D64,ab 3.2 3.2 常量与变量常量与变量注意:编译系统将

7、大写字母和小写字母认为是两个编译系统将大写字母和小写字母认为是两个不同的字符。不同的字符。 建议变量名的长度最好不要超过建议变量名的长度最好不要超过8 8个字符。个字符。在选择变量名和其它标识符时,应注意做到在选择变量名和其它标识符时,应注意做到“见名知意见名知意”,即选有含意的英文单词,即选有含意的英文单词 (或其缩写)作标识符。(或其缩写)作标识符。要求对所有用到的变量作强制定义,也就是要求对所有用到的变量作强制定义,也就是“先定义,后使用先定义,后使用” ” 。 3.3 3.3 整型数据整型数据3.3.1整型常量的表示方法 整型常量即整常数。在语言中,整常数整型常量即整常数。在语言中,整

8、常数可用以下三种形式表示:可用以下三种形式表示:(1)(1)十进制整数。十进制整数。 如:123, 123, -456 -456 。(2)(2)八进制整数。以八进制整数。以0 0开头的数是八进制数。开头的数是八进制数。 如:01230123表示八进制数表示八进制数123123,等于十进制数,等于十进制数83,-01183,-011表示八进制数表示八进制数-11,-11,即十进制数即十进制数-9-9。 3.3 3.3 整型数据整型数据(3)(3)十六进制整数。以十六进制整数。以0x0x开头的数是开头的数是1616进制数。进制数。 如:0x1230x123,代表,代表1616进制数进制数123,1

9、23,等于十进制数等于十进制数 291291。 -0x12-0x12等于十进制数等于十进制数1818。 3.3.2 整型变量 (1)整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。数据在内存中是以二进制形式存放的。 如: intint i; /* i; /* 定义为整型变量定义为整型变量 * */ / i=10; /* i=10; /* 给给i i赋以整数赋以整数10 */10 */ 3.3 3.3 整型数据整型数据注意:十进制数十进制数1010的二进制形式为的二进制形式为10101010,VCVC+ + 6.06.0为一个整型变量在内存中分配为一个整型变量在内存中分配4 4个字

10、节。个字节。数值是以补码数值是以补码(complement) (complement) 表示的。表示的。 3.3 3.3 整型数据整型数据(2)(2)整型变量的分类:整型变量的分类:共六种共六种有符号基本整型有符号短整型有符号长整型无符号基本整型无符号基本整型无符号短整型无符号短整型无符号长整型无符号长整型signed int signed short intsigned long intunsigned intunsigned short intunsigned long int 注意:括号表示其中的内容是可选的括号表示其中的内容是可选的. . 3.3 3.3 整型数据整型数据整数类型的有关

11、数据:整数类型的有关数据: 类型类型类型类型 类型说明符类型说明符类型说明符类型说明符 长度长度长度长度 数的范围数的范围数的范围数的范围 基本整型基本整型基本整型基本整型 intintintint 4 4 4 4字节字节字节字节 -2-2-2-2313131312 2 2 231313131-1-1-1-1 短整型短整型短整型短整型 short 2short 2short 2short 2字节字节字节字节 -2-2-2-2151515152 2 2 215151515-1-1-1-1 长整型长整型长整型长整型 long long long long 4 4 4 4字节字节字节字节 -2-2-

12、2-2313131312 2 2 231313131-1-1-1-1 无符号整型无符号整型无符号整型无符号整型 unsigned unsigned unsigned unsigned 4 4 4 4字节字节字节字节 0 0 0 0(2 2 2 232323232-1-1-1-1) 无符号短整型无符号短整型无符号短整型无符号短整型 unsigned short unsigned short unsigned short unsigned short 2 2 2 2字节字节字节字节 0 0 0 065535655356553565535 无符号长整型无符号长整型无符号长整型无符号长整型 unsig

13、ned long unsigned long unsigned long unsigned long 4 4 4 4字节字节字节字节 0 0 0 0(2 2 2 232323232-1-1-1-1) 3.3 3.3 整型数据整型数据(3)整型变量的定义: 规定在程序中所有用到的变量都必须在规定在程序中所有用到的变量都必须在程序中定义,即程序中定义,即“强制类型定义强制类型定义”。 例如: intint a,b;a,b;(指定变量、为整型)(指定变量、为整型) unsigned short unsigned short c,d;c,d; (指定变量、为无符号短整型)(指定变量、为无符号短整型)

14、long long e,fe,f; ;( (指定变量、为长整型)指定变量、为长整型)例例3.2 整型变量的定义与使用整型变量的定义与使用#include void main()int a,b,c,d; /*指定,为整型变量* unsigned ; *指定为无符号整型变量* 12;-24;10; ; printf(,); 说明:说明: 可以看到不同种类的整型数据可以可以看到不同种类的整型数据可以进行算术运算进行算术运算 运行结果: , 例例3.3 整型数据的溢出整型数据的溢出#include void main() short int a,b; a=32767; b=a+1; printf(“%

15、d,%dn”,a,b);说明:说明:数值是以补码表示的。一个短整型变数值是以补码表示的。一个短整型变量只能容纳量只能容纳-32768-327683276732767范围内的数,无范围内的数,无法表示大于法表示大于3276732767或小于或小于-32768-32768的数。遇此的数。遇此情况就发生情况就发生“溢出溢出”。运行结果: 32767,-32768 3.3 3.3 整型数据整型数据3.3.3 整型常量的类型 (1)(1)一个整数,如果其值在一个整数,如果其值在-32768-32768+32767+32767范范围内,认为它是围内,认为它是short intshort int型,它可以赋

16、值给型,它可以赋值给intint型和型和long long intint型变量。型变量。 (2) (2) 一个整数,如果其值超过了上述范围,一个整数,如果其值超过了上述范围,而在而在-2147483637-2147483637+2147483647+2147483647范围内,则范围内,则认为它是基本整型。可以将它赋值给一个认为它是基本整型。可以将它赋值给一个long long intint型变量。型变量。 3.3 3.3 整型数据整型数据(3)(3) 一个整常量后面加一个字母一个整常量后面加一个字母u u或或U U,认,认为是为是unsigned unsigned intint型,如型,如1

17、2345u12345u,在内存,在内存中按中按unsigned unsigned intint规定的方式存放规定的方式存放( (存储存储单元中最高位不作为符号位,而用来存储单元中最高位不作为符号位,而用来存储数据数据) )。如果写成。如果写成-1u-1u,则先将,则先将-1-1转换成转换成其补码其补码ffffffff(ffffffff(十六进制数十六进制数) ),然后按,然后按无符号数存储。无符号数存储。 3.3 3.3 整型数据整型数据(4)(4) 在一个整常量后面加一个字母在一个整常量后面加一个字母l l或或L L,则,则 认为是认为是long long intint型常量。例如型常量。例

18、如123l. 432L. 123l. 432L. 0L0L等。这往往用于函数调用中。如果函数的等。这往往用于函数调用中。如果函数的形参为形参为long long intint型,则要求实参也为型,则要求实参也为long long intint型。型。 3.4 3.4 浮点型数据浮点型数据3.4.1 浮点型常量的表示方法两种表两种表示形式示形式小数小数指数指数0.1230.1233 3e-3e-3注意:字母字母e(e(或或E)E)之前必须有数字,且之前必须有数字,且e e后面的后面的指数必须为整数指数必须为整数1e31e3、1.8e-31.8e-3、-123e-6-123e-6、-.1e-3-.

19、1e-3e3e3、2.1e3.52.1e3.5、.e3.e3、e e 3.4 3.4 浮点型数据浮点型数据规范化的指数形式:规范化的指数形式: 在字母在字母e e(或(或E E)之前的小数部分中,小数点左边)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字应有一位(且只能有一位)非零的数字. . 例如: 123.456123.456可以表示为:可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e0.123456e3,

20、 0.0123456e4, 0.00123456e 其中,其中,1.23456e31.23456e3 称为称为“规范化的指数形式规范化的指数形式”。 3.4 3.4 浮点型数据浮点型数据3.4.2 浮点型变量(1)浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占一个浮点型数据一般在内存中占4 4个字个字节节(32(32位位) )。与整型数据的存储方式不同,。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指分,分别存放。指数部分采

21、用规范化的指数形式。数形式。类型类型 位数位数 数的范围数的范围 有效数字有效数字floatfloatfloatfloat 32 32 1010-37-37 101038 38 6 6 7 7 位位doubledoubledoubledouble型型 6464 1010-307-307 1010308308 15 15 1616位位long double long double 6464 10 10-307-307 1010308308 15 15 1616位位 3.4 3.4 浮点型数据浮点型数据(2) 浮点型变量的分类 浮点型变量分为单精度(浮点型变量分为单精度(floatfloat型)、

22、双精度型)、双精度(doubledouble型)和长双精度型(型)和长双精度型(long doublelong double)三类)三类形式。形式。例例3.4 浮点型数据的舍入误差浮点型数据的舍入误差#include void main() float a,b; a = 123456.789e5; b = a + 20 ; printf(“a=%enb=%en”,a,b); 说明:说明:一个浮点型变量只能保证一个浮点型变量只能保证7 7位有效数字,后位有效数字,后面的数字是无意义的,并不准确地表示该数。应面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加当避免

23、将一个很大的数和一个很小的数直接相加或相减,否则就会或相减,否则就会“丢失丢失”小的数小的数 3.4 3.4 浮点型数据浮点型数据3.4.3 浮点型常量的类型 C C编译系统将浮点型常量作为双精度来处理。编译系统将浮点型常量作为双精度来处理。 例如:f = 2.45678 * 4523.65f = 2.45678 * 4523.65 系统先把系统先把2.456782.45678和和4523.654523.65作为双精度数,然后作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最进行相乘的运算,得到的乘也是一个双精度数。最后取其前后取其前7 7位赋给浮点型变量位赋给浮点型变量f f。如

24、是在数的后面加。如是在数的后面加字母字母f f或或F F(如(如1.65f, 654.87F1.65f, 654.87F),这样编译系统就),这样编译系统就会把它们按单精度(会把它们按单精度(3232位)处理。位)处理。 3.53.5字符型数据字符型数据 3.5.1 字符常量(1)(1)用单引号包含的一个字符是字符型常量用单引号包含的一个字符是字符型常量(2)(2)只能包含一个字符只能包含一个字符a a, ,A A, , 1 1abcabc、“a a” 3.53.5字符型数据字符型数据 有些以有些以“”开头的特殊字符称为转义字符开头的特殊字符称为转义字符n 换行t 横向跳格8列r 回车 反斜杠

25、ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字 3.53.5字符型数据字符型数据 3.5.2字符变量字字符符型型变变量量用用来来存存放放字字符符常常量量,注注意意只只能能放放一个字符。一个字符。字符变量的定义形式如下:字符变量的定义形式如下:char c1,c2;char c1,c2;可以用下面语句对可以用下面语句对c1,c2c1,c2赋值:赋值: c1c1aa;c2c2 b b ;一个字符变量在内存中占一个字节。一个字符变量在内存中占一个字节。 3.53.5字符型数据字符型数据 3.5.3 字符数据在内存中的存储形式及其字符数据在内存中的存储形式及其 使用方法使用方

26、法将一个字符常量放到一个字符变量中,实际将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,上并不是把该字符本身放到内存单元中去,而是将该字符的相应的而是将该字符的相应的ASCIIASCII代码放到存储代码放到存储单元中单元中。 这样使字符型数据和整型数据之间可以通这样使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。也可以以整数形式输出。例例3.6 向字符变量赋以整数。向字符变量赋以整数。 #include void main() char c1,c2; c1=97; c2=98; pri

27、ntf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); 说明:说明:在第和第在第和第4 4行中,将整数和分别行中,将整数和分别赋给赋给c1c1和和c2c2,它的作用相当于以下两个赋值语句:,它的作用相当于以下两个赋值语句: c1c1;c2c2; 因为因为a a和和b b的的ASCIIASCII码为和码为和运行结果: 97 98例例3.7 大小写字母的转换大小写字母的转换 #include void main() char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf(“c c,c1,c2);说明:说明:程序的作用是

28、将两个小写字母程序的作用是将两个小写字母a a和和b b转换成大转换成大写字母写字母A A和和B B。从代码表中可以看到每一。从代码表中可以看到每一个小写字母比它相应的大写字母的码大个小写字母比它相应的大写字母的码大。语言允许字符数据与整数直接进行算术运。语言允许字符数据与整数直接进行算术运算。算。 运行结果: 3.53.5字符型数据字符型数据说明: 有些系统(如有些系统(如VC+6.0VC+6.0)将字符变量定义为)将字符变量定义为signed signed charchar型。其存储单元中的最高位作为符号位,它的取型。其存储单元中的最高位作为符号位,它的取值范围是值范围是-128-1281

29、27127。如果在字符变量中存放一个。如果在字符变量中存放一个ASCIIASCII码为码为0 0127127间的字符,由于字节中最高位为间的字符,由于字节中最高位为0 0,因此用因此用%d%d输出字符变量时,输出的是一个正整数。如输出字符变量时,输出的是一个正整数。如果在字符变量中存放一个果在字符变量中存放一个ASCIIASCII码为码为128128255255间的字间的字符,由于在字节中最高位为符,由于在字节中最高位为1 1,用,用%d%d格式符输出时,格式符输出时,就会得到一个负整数。就会得到一个负整数。 3.53.5字符型数据字符型数据3.5.4字符串常量字符串常量是一对双撇号括起来的字

30、符序列字符串常量是一对双撇号括起来的字符序列. .合法的字符串常量合法的字符串常量: :“How do you do.”, “CHINA”How do you do.”, “CHINA”, “a” a” , “$123.45”$123.45”可以输出一个字符串,如可以输出一个字符串,如printf(“Howprintf(“How do you do.”) do you do.”); 3.53.5字符型数据字符型数据 是字符常量,是字符常量,”是字符串常量,是字符串常量,二者不二者不同。同。 如:假设被指定为字符变量假设被指定为字符变量 :char cchar cc=a; ”a”;c”CHINA

31、”; 结论:不能把一个字符串常量赋给一个字符不能把一个字符串常量赋给一个字符变量。变量。 3.53.5字符型数据字符型数据规定:在每一个字符串常量的结尾加一个规定:在每一个字符串常量的结尾加一个 “ “字字符符串结束标志串结束标志”,以便系统据此判断字符串是否结束。,以便系统据此判断字符串是否结束。规定以字符规定以字符作为字符串结束标志。作为字符串结束标志。 如:如果有一个字符串常量如果有一个字符串常量” ,实,实际上在内存中是:际上在内存中是:CHINA0 它占内存单元不是个字符,而是个字符,最后一它占内存单元不是个字符,而是个字符,最后一个字符为个字符为。但在输出时不输出。但在输出时不输出

32、。 3.63.6变量赋初值变量赋初值 1 1、语言允许在定义变量的同时使变量初始化语言允许在定义变量的同时使变量初始化如: intint a=3; / a=3; / 指定为整型变量,初值为指定为整型变量,初值为 floatfloat f=3.56; / f=3.56; / 指定为浮点型变量指定为浮点型变量, ,初值为初值为.56 .56 charchar c= c= a a; / ; / 指定为字符变量,初值为指定为字符变量,初值为a a 3.63.6变量赋初值变量赋初值 2 2、可以使被定义的变量的一部分赋初值。、可以使被定义的变量的一部分赋初值。 如: intint a,b,ca,b,c=

33、5=5; 表示指定、为整表示指定、为整型变量,但只对初始化,型变量,但只对初始化,c c的初值为的初值为3 3、如果对几个变量赋以同一个初值,、如果对几个变量赋以同一个初值, 应写成:应写成:intint a=3,b=3,c=3; a=3,b=3,c=3; 表示、表示、的初值都是。的初值都是。 不能写成不能写成 intint a=b=c=3a=b=c=3; ; 注意:初始化不是在编译阶段完成的而是在程序运初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语行时执行本函数时赋初值的,相当于有一个赋值语句。句。 3.73.7各类数值型数据间的混合运算各类数值型数据间的

34、混合运算 整型(包括整型(包括int,short,longint,short,long)、浮点)、浮点型(包括型(包括float,doublefloat,double)可以混合运算。)可以混合运算。在进行运算时在进行运算时, ,不同类型的数据要先转换成不同类型的数据要先转换成同一类型同一类型, ,然后进行运算然后进行运算. .上述的类型转换是由系统自动进行的上述的类型转换是由系统自动进行的 3.83.8算术运算符和算术表达式算术运算符和算术表达式3.8.1 运算符简介 的运算符有以下几类:(1)(1)算术运算符算术运算符 (+ - * / %+ - * / %)(2)(2)关系运算符关系运算符

35、 ( ! !)(3)(3)逻辑运算符逻辑运算符 (!(! |)(4)(4)位运算符位运算符 ( | | )(5)(5)赋值运算符赋值运算符 (及其扩展赋值运算符)(及其扩展赋值运算符)(6)(6)条件运算符条件运算符 (?:)(?:)(7)(7)逗号运算符逗号运算符 ( (,),) 3.83.8算术运算符和算术表达式算术运算符和算术表达式(8)(8)指针运算符指针运算符 (* *和)和)(9)(9)求字节数运算符(求字节数运算符(sizeof)(10)(10)强制类型转换运算符(强制类型转换运算符( ( (类型)类型) ) )(11)(11)分量运算符(分量运算符(-)(12)(12)下标运算

36、符()下标运算符()(13)(13)其他其他 (如函数调用运算符()(如函数调用运算符() 3.83.8算术运算符和算术表达式算术运算符和算术表达式3.8.2 算术运算符和算术表达式 (1)基本的算术运算符: (加法运算符,或正值运算符。如加法运算符,或正值运算符。如: :、)、) (减法运算符,或负值运算符。如减法运算符,或负值运算符。如: :、)、)* (乘法运算符。如(乘法运算符。如: :* *) (除法运算符。如除法运算符。如: :) (模运算符,或称求余运算符,两侧均应为整型数模运算符,或称求余运算符,两侧均应为整型数据,如据,如: :的值为)。的值为)。 3.83.8算术运算符和算

37、术表达式算术运算符和算术表达式(2) 算术表达式和运算符的优先级与结合性 用算术运算符和括号将运算对象用算术运算符和括号将运算对象( (也称操作数)连也称操作数)连接起来的、符合语法规则的式子,称为接起来的、符合语法规则的式子,称为算术算术表达式表达式。运算对象包括常量、变量、函数等。运算对象包括常量、变量、函数等。 例如: * *.5.5aa 是一个合法的表达式是一个合法的表达式 3.83.8算术运算符和算术表达式算术运算符和算术表达式语言规定了运算符的优先级和结合性。语言规定了运算符的优先级和结合性。 在表达式求值时,先按运算符的优先级别高低在表达式求值时,先按运算符的优先级别高低次序执行

38、,例如先乘除后加减。次序执行,例如先乘除后加减。 规定了各种运算符的结合方向规定了各种运算符的结合方向( (结合性结合性) ) 算术运算符的结合方向为算术运算符的结合方向为“自左至右自左至右”,即先,即先左后右左后右 。 3.83.8算术运算符和算术表达式算术运算符和算术表达式(3)强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成可以利用强制类型转换运算符将一个表达式转换成所需类型。所需类型。 一般形式一般形式: :(类型名)(表达式)(类型名)(表达式)例如:(double)(double) 将转换成将转换成doubledouble类型类型( (int)(x+yint)(x+

39、y) ) 将将x+yx+y的值转换成整型的值转换成整型(float)(float)(5%35%3) 将将5%35%3的值转换成的值转换成floatfloat型型例例3.8 强制类型转换。强制类型转换。 #include void main( ) float ; int ; 3.6; (int); printf(x=%f,i=%dn,x,i);说明:说明:有两种类型转换,一种是在运算时不必用有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如户指定,系统自动进行的类型转换,如3+6.53+6.5。第二种是强制类型转换。当自动类型转换不能实第二种是强制类型转换。当自动类型转换不能

40、实现目的时,可以用强制类型转换。现目的时,可以用强制类型转换。运行结果: x3.600000, i=3 3.83.8算术运算符和算术表达式算术运算符和算术表达式(4) 自增、自减运算符 作用是使变量的值增或减作用是使变量的值增或减如: ,(在使用之前,先使的值加,(在使用之前,先使的值加 (减)(减),(在使用之后,使的值加(,(在使用之后,使的值加( 减)减) 3.83.8算术运算符和算术表达式算术运算符和算术表达式i+与+i的区别: 是先执行后,再使用的值;是先执行后,再使用的值; 是先使用的值后,再执行。是先使用的值后,再执行。例如:假定i=3 ; i i的值先变成的值先变成4, 4,

41、再赋给再赋给,j,j的值也为的值也为 ; 先将先将 i i的值的值3 3赋给赋给, ,的值为,然后变为的值为,然后变为 3.83.8算术运算符和算术表达式算术运算符和算术表达式注意: (1)(1)自增运算符(),自减运算符(),自增运算符(),自减运算符(),只能用于变量,而不能用于常量或表达式,只能用于变量,而不能用于常量或表达式, (2)(2)和的结合方向是和的结合方向是“自右至左自右至左”。 自增(减)运算符常用于循环语句中使循环变量自增(减)运算符常用于循环语句中使循环变量自动加。也用于指针变量,使指针指向下一个地址自动加。也用于指针变量,使指针指向下一个地址 3.83.8算术运算符和

42、算术表达式算术运算符和算术表达式(5) 有关表达式使用中的问题说明 ANSI CANSI C并没有具体规定表达式中的子表达式的求并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。值顺序,允许各编译系统自己安排。 例如例如:对表达式对表达式 a = f1( )+f2( )a = f1( )+f2( ) 并不是所有的编译系统都先调用并不是所有的编译系统都先调用f1( )f1( ), 然后然后调用调用f2( )f2( )。在有的情况下结果可能不同。有时会出。在有的情况下结果可能不同。有时会出现一些令人容易搞混的问题,因此务必要小心谨慎现一些令人容易搞混的问题,因此务必要小心谨慎。

43、3.83.8算术运算符和算术表达式算术运算符和算术表达式语言中有的运算符为一个字符,有的运算符由语言中有的运算符为一个字符,有的运算符由两个字符组成两个字符组成 ,为避免误解,最好采取大家都能理,为避免误解,最好采取大家都能理解的写法。解的写法。 例如例如:不要写成不要写成i+ji+j的形式,而应写成的形式,而应写成 ( (i+)+ji+)+j的形式的形式 3.83.8算术运算符和算术表达式算术运算符和算术表达式在调用函数时,实参数的求值顺序,标准并无统在调用函数时,实参数的求值顺序,标准并无统一规定。一规定。例如:的初值为,如果有下面的函数调用:的初值为,如果有下面的函数调用: printf

44、(,i+) 在有的系统在有的系统中,从左至右求值,输出中,从左至右求值,输出“,”。在多数系。在多数系统中对函数参数的求值顺序是自右而左,统中对函数参数的求值顺序是自右而左,函数输出的是函数输出的是“,”。以上这种写法。以上这种写法不宜提倡,不宜提倡, 最好改写成最好改写成 j = i+; printf(%d, %d, j,i)不要写出别人看不懂的也不要写出别人看不懂的也不知道系统会怎样执行程不知道系统会怎样执行程序序 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (1)赋值运算符 赋值符号赋值符号“”就是赋值运算符,它的作用是就是赋值运算符,它的作用是将一个数据赋给一个变量。

45、如将一个数据赋给一个变量。如“”的作用的作用是执行一次赋值操作(或称赋值运算)。把常是执行一次赋值操作(或称赋值运算)。把常量赋给变量。也可以将一个表达式的值赋量赋给变量。也可以将一个表达式的值赋给一个变量给一个变量. . 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (2)类型转换 如果赋值运算符两侧的类型不一致,但都如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型是数值型或字符型时,在赋值时要进行类型转换。转换。将浮点型数据(包括单、双精度)赋给整将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分。型变量时,舍弃浮点数的小数部分。如

46、:为整型变量,执行为整型变量,执行“i=3.56i=3.56”的结果是使的结果是使的值为,以整数形式存储在整型变量中的值为,以整数形式存储在整型变量中. . 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将整型数据赋给单、双精度变量时,数值不变,将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中但以浮点数形式存储到变量中 如: 将赋给将赋给floatfloat变量,即执行,先变量,即执行,先将转换成将转换成0 0,再存储在中。,再存储在中。 将赋给型变量,即执行将赋给型变量,即执行,则将补足有效位数字为,则将补足有效位数字为,然后以双精度浮点数形式存储,然后以

47、双精度浮点数形式存储到变量中。到变量中。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将一个将一个doubledouble型数据赋给型数据赋给floatfloat变量时,截取其前变量时,截取其前面面7 7位有效数字,存放到位有效数字,存放到floatfloat变量的存储单元(变量的存储单元(4 4个个字节)中。但应注意数值范围不能溢出。字节)中。但应注意数值范围不能溢出。 如:float float f;f; double double d=123.456789e100; d=123.456789e100; f=d f=d; ; 就出现溢出的错误。就出现溢出的错误。 如果将一

48、个如果将一个floatfloat型数据赋给型数据赋给doubledouble变量时,数值不变量时,数值不变,有效位数扩展到变,有效位数扩展到1616位,在内存中以位,在内存中以8 8个字节存储个字节存储 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 字符型数据赋给整型变量时,由于字符只占字符型数据赋给整型变量时,由于字符只占1 1个字个字节,而整型变量为个字节,因此将字符数据(个节,而整型变量为个字节,因此将字符数据(个二进位)放到整型变量存储单元的低位中。二进位)放到整型变量存储单元的低位中。第一种情况第一种情况: : 如果所用系统将字符处理为无符号的字符类型,或程如果所用系

49、统将字符处理为无符号的字符类型,或程序已将字符变量定义为序已将字符变量定义为 unsigned char unsigned char 型,则将字型,则将字符的位放到整型变量低位,高位补零。符的位放到整型变量低位,高位补零。例如:将字符例如:将字符赋给赋给intint 型变量型变量 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第二种情况第二种情况: : 如果所用系统(如如果所用系统(如Turbo C+Turbo C+)将字符处理为带符号)将字符处理为带符号的(即的(即signed charsigned char),若字符最高位为,则整型),若字符最高位为,则整型变量高位补;若字

50、符最高位为,则高位全补变量高位补;若字符最高位为,则高位全补。这称为。这称为“符号扩展符号扩展”,这样做的目的是使数值保,这样做的目的是使数值保持持不变,如变量(字符不变,如变量(字符)以整数形式输)以整数形式输出出为,的值也是。为,的值也是。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将一个将一个intint、shortshort、longlong型数据赋给一个型数据赋给一个charchar型变型变量时,只将其低量时,只将其低8 8位原封不动地送到位原封不动地送到charchar型变量(即型变量(即截断)。截断)。例如:int i=289;char c=a;c=i; 赋值

51、情况赋值情况 :c c的值为的值为3333, 如果用如果用“%c%c”输输出出c c,将得到字符,将得到字符“! !” (其(其ASCIIASCII码为码为3333)。)。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将带符号的整型数据(将带符号的整型数据(intint型)赋给型)赋给longlong型变量型变量时,要进行符号扩展,将整型数的时,要进行符号扩展,将整型数的1616位送到位送到longlong型低型低1616位中位中: :如果如果intint型数据为正值(符号位为),则型数据为正值(符号位为),则longlong型变量的高型变量的高1616位补;位补;如果如果i

52、ntint型变量为负值(符号位为),则型变量为负值(符号位为),则longlong型变量的高型变量的高1616位补,以保持数值不改变。位补,以保持数值不改变。 反之,若将一个反之,若将一个longlong型数据赋给一个型数据赋给一个intint型变量,型变量,只将只将longlong型数据中低型数据中低1616位原封不动地送到整型变位原封不动地送到整型变量(即截断)。量(即截断)。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 例如:int a; long b;a=b 赋值情况如图赋值情况如图 :如果(八进制数)如果(八进制数)则赋值后值为。则赋值后值为。 3.9 3.9 赋值

53、运算符和赋值表达式赋值运算符和赋值表达式 将将unsigned unsigned intint型数据赋给型数据赋给long long intint型变量时,不型变量时,不存在符号扩展问题,只需将高位补即可。将一个存在符号扩展问题,只需将高位补即可。将一个unsignedunsigned类型数据赋给一个占字节数相同的非类型数据赋给一个占字节数相同的非unsignedunsigned型整型变量(例如:型整型变量(例如:unsigned unsigned intint -intint,unsigned long-longunsigned long-long,unsigned shortunsigne

54、d short-short-short),将),将unsignedunsigned型变量的内容原样送到非型变量的内容原样送到非unsignedunsigned型变量中,但如果数据范围超过相应整型的型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。范围,则会出现数据错误。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 例如:unsigned int 65535; int b;; 将整个送到中将整个送到中, ,由于是由于是intint, ,第位是符号位,因此第位是符号位,因此b b成了成了负数。根据补码知识可知,的负数。根据补码知识可知,的值为值为-1-1,可以用,可以

55、用printfprintf(%d%d,),); ;来验证。来验证。 将非将非unsignedunsigned型数据赋给长度相同的型数据赋给长度相同的unsignedunsigned型型变量,也是原样照赋(连原有的符号位也作为变量,也是原样照赋(连原有的符号位也作为数值一起传送)。数值一起传送)。 例例3.9 有符号数据传送给无符号变量。有符号数据传送给无符号变量。 #include void () ; ; ; (n,);说明:说明:“%u%u”是输出无符号数是输出无符号数时所用的格式符。如果为正时所用的格式符。如果为正值,且在值,且在3276732767之间,则赋之间,则赋值后数值不变。赋值情

56、况见图值后数值不变。赋值情况见图 图图运行结果:运行结果: 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (3) 复合的赋值运算符 在赋值符在赋值符“”之前加上其他运算符,可以构成复之前加上其他运算符,可以构成复合的运算符。合的运算符。例如: 等价于等价于 * * 等价于等价于 * *()() 等价于等价于 以“”为例来说明,它相当于使进行一次自加()的操作。即先使加,再赋给。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 为便于记忆,可以这样理解: a += b (a += b (其中其中a a为变量,为变量,b b为表达式为表达式) ) a += b a +

57、= b(将有下划线的(将有下划线的“a+”a+”移到移到“=”=”右右侧)侧) |_|_ a = a + b a = a + b (在(在“=”=”左侧补上变量名左侧补上变量名a a) 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 注意:如果是包含若干项的表达式,则相当于它有 括号。如: 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) 凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。 语言规定可以使用种复合赋值运算符:

58、,*,| 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (4) 赋值表达式 由赋值运算符将一个变量和一个表达式连接由赋值运算符将一个变量和一个表达式连接起来的式子称为起来的式子称为“赋值表达式赋值表达式”。一般形式为: 例如: “5”5”是一个赋值表达式是一个赋值表达式 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 对赋值表达式求解的过程是: 求赋值运算符右侧的求赋值运算符右侧的“表达式表达式”的值的值; 赋给赋值运算符左侧的变量。赋给赋值运算符左侧的变量。例如: 赋值表达式赋值表达式“=3*5”=3*5”的值为的值为1515,执行,执行表达式后,变量表达式后,

59、变量a a的值也是的值也是1515。 注意: 一个表达式应该有一个值 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 左值 (lvalue) : : 赋值运算符左侧的标识符赋值运算符左侧的标识符变量可以作为左值变量可以作为左值; ;而表达式就不能作为左值而表达式就不能作为左值( (如如a+ba+b););常量也不能作为左值,常量也不能作为左值, 右值 (lvalue) : :出现在赋值运算符右侧的表达式出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。都可以作为右值。 3.9 3.9 赋值运算符和赋值表

60、达式赋值运算符和赋值表达式 赋值表达式中的赋值表达式中的“表达式表达式”,又可以是一个赋值表,又可以是一个赋值表达式达式. .例如: 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)”

61、和和“a=b=5”a=b=5”等价等价. . 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 请分析下面的赋值表达式请分析下面的赋值表达式(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)是左值

62、是左值 注意:在对赋值表达式在对赋值表达式(a=3*5)(a=3*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 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 赋值表达式也可以包含复合的赋值运算符。赋值表达式也可以包含复合的赋值运算符。 如:a+=a-=a*aa+=a-=a*a分析:此赋值表达式的求解步骤如下此赋值表达式的求解步骤如下 先进行先进行“* *”的运算,的运算, 它

63、相当它相当于于* *,a a的值为的值为144144132132。再进行再进行“”的运算,相当的运算,相当于于 =a+(-132)=a+(-132),a a的值为的值为132-132132-132-264-264。 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 将赋值表达式作为表达式的一种,使赋值操作不仅将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中出现在其他语句(如输出语句、循环语句等)中. . 如:printf(%d,a=b); 分析:如果如果b b的

64、值为的值为3 3, 则输出则输出a a的值的值( (也是表也是表达式达式a=ba=b的值的值) )为为3 3。在一个语句中完成。在一个语句中完成了赋值和输出双重功能。了赋值和输出双重功能。 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式逗号运算符:将两个表达式连接起来将两个表达式连接起来, ,又称为又称为“顺序求顺序求值运算符值运算符” 如:5 5, 一般形式: 表达式,表达式求解过程: 先求解表达式,再求解表达式。整个逗号先求解表达式,再求解表达式。整个逗号表达式的值是表达式的值。表达式的值是表达式的值。 逗号表达式 的值为14 3.10 3.10 逗号运算符和逗号表达式逗

65、号运算符和逗号表达式例:逗号表达式逗号表达式* *5 5,* * 分析:赋值运算符的优先级别高于逗号运算符,赋值运算符的优先级别高于逗号运算符, 因因此应先求解此应先求解* *5.5.的值为5,然后求解*,得。整个逗号表达式的值为。 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式 如:(* *,* *),a+5,a+5 先计算出的值等于,再进行先计算出的值等于,再进行* *的运算得的运算得 6060(但值未变,仍为(但值未变,仍为1515),再进行得),再进行得 ,即整个表达式的值为。,即整个表达式的值为。 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式逗号表达式的

66、一般形式可以扩展为逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式 它的值为表达式的值。它的值为表达式的值。逗号运算符是所有运算符中级别最低的逗号运算符是所有运算符中级别最低的例: (,(,*) ,*3赋值表达式,将一个逗号表达式的值赋给,的值等于 逗号表达式,包括一个赋值表达式和一个算术表达式,的值为,整个逗号表达式的值为18。 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式注意:并不是任何地方出现的逗号都是作为逗并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间号运算符。例如函数参数也是用逗号来间隔的。隔的。 如: printf(“%d,%d,%d”,a,b,c);“,”并不是一个逗号表达式,它是printf函数的3个参数printf(“%d,%d,%d”,(a,b,c),b,c) “(,)”是一个逗号表达式,它的值等于的值。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号