第03章数据类型精选PPT.ppt
第03章数据类型第1页,此课件共96页哦l 本章要点本章要点第2页,此课件共96页哦l 主要内容主要内容3.0 3.0 计算机中的数计算机中的数3.1 C3.1 C的数据类型的数据类型3.2 3.2 常量与变量常量与变量3.3 3.3 整型数据整型数据3.4 3.4 浮点型数据运行浮点型数据运行3.5 3.5 字符型数据字符型数据 第3页,此课件共96页哦l 主要内容主要内容3.3.变量赋初值变量赋初值 3.7 3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算 3.8 3.8 算术运算符和算术表达式算术运算符和算术表达式 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式 第4页,此课件共96页哦3.0 计算机中的数o计算机中的数是以二进制存储的,每一个0或者1叫做1位(Bit)。o计算机处理数的时候,总是以字节为基本单位,所以要表示一个数,最少要20字节,不够的话就21字节、22字节、23字节。而1字节(Byte)=8位,更多字节则用2的幂次表示,如1KB=210B,1MB=220B,1GB=230Bo计算机存储整数和存储浮点数的方法是不同的,由于存储浮点数方法比较复杂,这里不做具体讨论。我们只研究整数。第5页,此课件共96页哦整数的三种表示法之一:原码o原码的求法如下:忽略符号,除2取余,逆序排列,最后补符号位。符号位总是最高位,0为正,1为负,其余位叫做数值位。o假定用1字节表示整数,求-44的原码求法如下:44/2=22余0,22/2=11余0,11/2=5余1,5/2=2余1,2/2=1余0,1/2=0余1o于是-44=(10101100)2,顺便得到44=(00101100)2 第二个0是补足8位用的。第6页,此课件共96页哦整数的三种表示法之二:反码o反码的求法如下:正数的反码=原码,负数的反码先求原码,然后符号位不变,数值位全部取反。o例如44的原码=(00101100)2 反码o例如已知原码-44=(10101100)2 那么反码-44=(11010011)2第7页,此课件共96页哦整数的三种表示法之三:补码o补码求法如下:正数的补码=原码,负数的补码=其绝对值的原码逐位取反+1o例如44的原码=(00101100)2=补码o例如求-44的补码,则要:1.求其绝对值的原码:(00101100)22.逐位取反:(11010011)23.+1:+1所以-44的补码是:(11010100)2o换句话说,负数的补码=反码+1第8页,此课件共96页哦已知一个数的补码,如何计算这个数?o如果补码=(00101100)2 那么显然是一个正数,所以这样求即可:1*25+1*23+1*22=44o如果补码=(11010100)2 那么就要:1.取反:(00101011)2 2.+1:1得到:(00101100)2=44,所以是-44o结论:补码和原数的来回转换,都是取反取反+1第9页,此课件共96页哦补码的一个有趣的特点o符号扩展n把补码的符号位向左边填充,叫做符号扩展,例如:o结论是:符号扩展不会改变原数的大小符号扩展不会改变原数的大小。(注意以上的二进制数应该是写成一串的,为方便查看才特意换行的,第一列数都是1,第二列数都是-1)原数(1字节)0000000111111111扩展为2字节00000000 0000000111111111 11111111扩展为4字节00000000 00000000 00000000 0000000111111111 11111111 11111111 11111111第10页,此课件共96页哦总结一下o三种码的共同点是:最高位都是符号位,0表示正数,1表示负数。同一个正数,用三种码来表示是完全相同的。o计算机使用补码补码存储整数,原码和反码在浮点数的存储中才会被用到。o计算机存储一个整数,可能使用20,21,22,23字节。当一个整数需要增大字节时,补码使用符号扩展来填充高位。第11页,此课件共96页哦三种码的表达能力o从数学角度说,1字节能表示28=256个数。下面的讨论仅针对1字节的情况,其它情况类推。o原码只能表示255个数,因为00000000和10000000都表示零,反码结论与此类似。所以这两个码表示范围是-127127。o补码能够表示256个数,因为只有00000000表示零,10000000则表示-128。零的表示法唯一是补码的一个优点。补码的表示范围是-128127。o有些情况下不需要处理负数,此时可以规定最高位的符号位不再表示符号,而作为数值位,这样补码的表示范围变成0255,这种数叫无符号数。第12页,此课件共96页哦八进制和十六进制o给定一个二进制补码:1011110101101110,你能够很快记住么?估计很难。o八进制和十六进制是为了方便人们读写和记忆而引入的。把一个二进制串写成八进制和十六进制时,最高位都被看成数值位。o八进制使用0-7这八个符号,十六进制使用0-9和A-F十六个符号。A表示10,B表示11F表示15,其中A-F也可以使用小写字母。o上述那个二进制串,相当于(136556)8或者(BD6E)16,可见使用十六进制确实方便得多。第13页,此课件共96页哦八进制和二进制的相互转换o八进制二进制:每一个八进制位,替换成三个的二进制位。反之亦然。o如:(137)8=(1011111)2八进制八进制二进制二进制00001001201030114100510161107111第14页,此课件共96页哦十六进制和二进制的相互转换o十六进制二进制:每一个十六进制位,替换成四个的二进制位。反之亦然。o如:(137)16=(100110111)2十六进制十六进制二进制二进制0000010001200103001140100501016011070111十六进制十六进制二进制二进制8100091001A(a)1010B(b)1011C(c)1100D(d)1101E(e)1110F(f)1111第15页,此课件共96页哦十六进制和十进制的相互转换o十进制十六进制:除16取余。例如求44的十六进制,求法如下:44/16=2余12(就是C),2/16=0余2 于是44=(2C)16o上述做法可以推广到十进制N进制。o十六进制十进制:按权重求和。例如求(ABC)16的十进制,求法如下:10*162+11*161+12*160=2748o上述做法可以推广到N进制十进制。第16页,此课件共96页哦ASCII码o计算机存储任何信息都是用二进制数,所以字符也用二进制存储。ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)码规定了任何一个字符和整数的对应关系,所以只要存储了对应的整数,就相当于存储了字符。oASCII码中:031及127(共33个)是控制字符或通信专用字符(其余为可显示字符);32126(共95个)是字符(32是空格),其中4857为0到9十个阿拉伯数字;6590为26个大写字母,97122号为26个小写字母,其余为一些标点符号、运算符号等。o记住一个结论:ASCII中,所有大写字母是连续编码,所有小写字母是连续编码,所有数字字符是连续编码。第17页,此课件共96页哦 3.1 C的数据类型C语言提供了以下一些数据类型。数据类型数据类型构造类型构造类型指针类型指针类型空类型(空类型(无值类型)无值类型)voidvoid枚举类型枚举类型枚举类型枚举类型 enumenumenumenum数组类型数组类型数组类型数组类型结构类型结构类型结构类型结构类型 structstructstructstruct联合类型联合类型联合类型联合类型 unionunionunionunion基本类型基本类型整型整型整型整型 intintintint字符型字符型字符型字符型 charcharcharchar实型(浮点型)实型(浮点型)实型(浮点型)实型(浮点型)单精度实型单精度实型单精度实型单精度实型 floatfloatfloatfloat双精度实型双精度实型双精度实型双精度实型 double double第18页,此课件共96页哦 3.2 常量与变量3.2.1 常量和符号常量常量和符号常量o在程序运行过程中,其值不能被改变的量称为常量o常量区分为不同的类型:整型 100,125,-100,0实型 3.14,0.125,-3.789字符型 a,b,2字符串 a,ab,1232第19页,此课件共96页哦例3.1 符号常量的使用#define PRICE 30#define PRICE 30#include#include void main()void main()int num,total;int num,total;num=10;num=10;total=num*PRICE;total=num*PRICE;printf(total=%dn,total);printf(total=%dn,total);运行结果:运行结果:total=300total=300说明:说明:说明:说明:程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算,但不能被重新赋值,如:PRICE=40;/*/*错误错误!*/!*/第20页,此课件共96页哦3.2.2变量变量o变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。o变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。第21页,此课件共96页哦 3.2 常量与变量 变量命名的规定:语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。例:例:sum,_total,month,Student_name,lotus_1_2_3,BASIC,li_ling M.D.John,¥123,3D64,ab 第22页,此课件共96页哦注意:注意:注意:注意:o编译系统将大写字母和小写字母认为是两个不同的字符。o建议变量名的长度最好不要超过8个字符(当你有机会使用很古老的系统的时候)。o在选择变量名和其它标识符时,应注意做到“见名知意”,即选有含意的英文单词(或其缩写)作标识符。o要求对所有用到的变量作强制定义,也就是“先定义,后使用”。第23页,此课件共96页哦 3.3 整型数据3.3.1整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数可用以下三种形式表示:(1)十进制整数。如:如:123,-456,4。(2)八进制整数。以0头的数是八进制无符号数。如:如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。第24页,此课件共96页哦 3.3 整型数据(3)十六进制整数。以0 x开头的数是16进制无符号数。如:如:0 x123,代表16进制数123,等于十进制数 291。-0 x12等于十进制数18。3.3.2 整型变量整型变量(1)(1)整型数据在内存中的存放形式整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。如如:int i;/*定义为整型变量*/i=10;/*给i赋以整数10*/第25页,此课件共96页哦 3.3 整型数据注意:注意:o十进制数10的二进制形式为1010,Turbo C 2.0和Turbo C+3.0为一个整型变量在内存中分配2个字节的存储单元(不同的编译系统为整型数据分配的字节数是不相同的,VC+6.0则分配4个字节)。o数值是以补码(complement)表示的。第26页,此课件共96页哦 3.3 整型数据(2)(2)整型变量的分类整型变量的分类共六种共六种有符号基本整型有符号短整型有符号长整型无符号基本整型无符号短整型无符号长整型(signed)int(signed)short(int)(signed)long(int)unsigned intunsigned short(int)unsigned long(int)注意:注意:括号表示其中的内容是可选的.第27页,此课件共96页哦 3.3 整型数据o整数类型的有关数据:类型类型 类型说明符类型说明符 长度长度 数的范围数的范围 基本型基本型 intint 2 2 2 2或或或或4 4 4 4字节字节字节字节 短整型短整型 short 2short 2字节字节 -2 -215152 21515-1-1 长整型长整型 long long 4 4字节字节 -2 -231312 23131-1-1 无符号整型无符号整型 unsigned unsigned int int 2 2 2 2或或或或4 4 4 4字节字节字节字节 无符号短整型无符号短整型 unsigned short unsigned short 2 2字节字节 0 06553565535 无符号长整型无符号长整型 unsigned long unsigned long 4 4字节字节 0 0(2 23232-1-1)第28页,此课件共96页哦 3.3 整型数据例如:整数13在内存中实际存放的情况:第29页,此课件共96页哦 3.3 整型数据(3)(3)整型变量的定义整型变量的定义:规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。例如例如:int a,bint a,b(指定变量、为整型)unsigned short c,d;unsigned short c,d;(指定变量、为无符号短整型)long e,f;long e,f;(指定变量、为长整型)第30页,此课件共96页哦例3.2 整型变量的定义与使用#include#include void main()()int a,b,c,d;/*指定指定,为整型变量为整型变量*unsigned;/*指定为无符号整型变量指定为无符号整型变量*12;-24;10;printf(a+u=%d,b+u=%dn,d);说明:说明:说明:说明:可以看到不同种类的整型数据可以进行算术运算 运行结果:运行结果:,第31页,此课件共96页哦例3.3 整型数据的溢出#include#include void main()void main()short int a,b;short int a,b;a=32767;a=32767;b=a+1;b=a+1;printf(“%d,%dn”,a,b);printf(“%d,%dn”,a,b);说明:说明:说明:说明:数值是以补码表示的。一个整型变量只能容纳-3276832767范围内的数,无法表示大于32767或小于-32768的数。遇此情况就发生“溢出”。运行结果:运行结果:32767,-3276832767,-32768第32页,此课件共96页哦 3.3 整型数据3.3.3 整型常量的类型整型常量的类型(1)一个整数,如果其值在-32768+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。(2)一个整数,如果其值超过了上述范围,而在-2147483637+2147483647范围内,则认为它是长整型。可以将它赋值给一个long int型变量。第33页,此课件共96页哦 3.3 整型数据(3)如果所用的C版本(如Turbo C)分配给short int与int型数据在内存中占据的长度相同,则它的表数范围与int型相同。因此一个int型的常量同时也是一个short int型常量,可以赋给int型或short int型变量。第34页,此课件共96页哦 3.3 整型数据(4)一个整常量后面加一个字母u或U,认为是unsigned int型,如12345u,在内存中按unsigned int规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据)。如果写成-12345u,则先将-12345转换成其补码53191,然后按无符号数存储。第35页,此课件共96页哦 3.3 整型数据(5)在一个整常量后面加一个字母l或L,则认为是long int型常量。例如:123l,432L,0L 用于函数调用中。o如果函数的形参为long int型,则要求实参也为long int型。第36页,此课件共96页哦 3.4 浮点型数据3.4.13.4.1浮点型常量的表示方法浮点型常量的表示方法两种表两种表示形式示形式小数小数指数指数0.1230.1233 3e-3e-3注意注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数。如果是纯小数,则整数部分的0可以省略。如0.123可以写成.123。1e31e3、1.8e-31.8e-3、-123e-6-123e-6、-.1e-3-.1e-3e3e3、2.1e3.52.1e3.5、.e3.e3、e e 第37页,此课件共96页哦 3.4 浮点型数据规范化的指数形式:规范化的指数形式:在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字.例如例如:123.456可以表示为:123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,0.00123456e 其中的1.23456e31.23456e3称为“规范化的指数形式”。第38页,此课件共96页哦 3.4 浮点型数据3.4.2 浮点型变量浮点型变量(1)(1)浮点型数据在内存中的存放形式浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。第39页,此课件共96页哦类型 位数 数的范围 有效数字float 32 10-37 1038 67 位double 64 10-30710308 1516位long double 128 10-4931104932 1819位 3.4 浮点型数据(2)(2)浮点型变量的分类浮点型变量的分类 浮点型变量分为单精度(float型)、双精度(double型)和长双精度型(long double)三类形式。第40页,此课件共96页哦例3.4 浮点型数据的舍入误差#include#include void main()void main()float a,b;float a,b;a=123456.789e5;a=123456.789e5;b=a+20;b=a+20;printf(“%fn”,b);printf(“%fn”,b);说明:说明:说明:说明:一个float型变量最多只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。运行结果:运行结果:123456.789e5123456.789e5第41页,此课件共96页哦 3.4 浮点型数据3.4.3 浮点型常量的类型浮点型常量的类型 C编译系统将浮点型常量作为双精度来处理。例如例如:f=2.45678*4523.65 系统先把2.45678和4523.65作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量f。如是在数的后面加字母f或F(如1.65f,654.87F),这样编译系统就会把它们按单精度(32位)处理。第42页,此课件共96页哦 3.5 字符型数据 3.5.1 字符常量字符常量(1)用单引号包含的一个字符是字符型常量(2)只能包含一个字符a a,A A,1 1abcabc、“a a”第43页,此课件共96页哦 3.5 字符型数据 有些以有些以“”开头的特殊字符称为转义字符开头的特殊字符称为转义字符n 换行t 横向跳格r 回车 反斜杠ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字第44页,此课件共96页哦例3.5 转义字符的使用#include#include void void main()main()printf(printf(ab ct derftgnab ct derftgn););printf(htibbj kn);printf(htibbj kn);说明:这个例子看看就好,没必要深究运行结果。只要知道转义字符在输出的时候,会被解释成转义后的含义,而非字面上的字符即可。第45页,此课件共96页哦 3.5 字符型数据 3.5.2字符变量字符变量o字符型变量用来存放字符常量,注意只能放一个字符。o字符变量的定义形式如下:char c1,c2;可以用下面语句对c1,c2赋值:c1a;c2 b;o一个字符变量在内存中占一个字节。第46页,此课件共96页哦 3.5 字符型数据 3.5.3 字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法o一个字符常量存放到一个字符变量中,实际上并不是把该字符的字型放到内存中去,而是将该字符的相应的ASCII代码放到存储单元中。这样使字符型数据和整型数据之间可以通用。注意:一个字符数据既可以以字符形式输出,也可以以整数形式输出。第47页,此课件共96页哦例3.6 向字符变量赋以整数。#include#include void main()void main()char c1,c2;char c1,c2;c1=97;c1=97;c2=98;c2=98;printf(“%c%cn”,c1,c2);printf(“%c%cn”,c1,c2);printf(“%d%dn”,c1,c2);printf(“%d%dn”,c1,c2);oo说明:说明:说明:说明:在第和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1=a;c2=b;因为a和b的ASCII码为97和98o运行结果:运行结果:97 9897 98第48页,此课件共96页哦例3.7 大小写字母的转换#include#include void main()void main()char c1,c2char c1,c2;c1=c1=a;a;c2=c2=b;b;c1=c1-32;c1=c1-32;/*/*也可以写成也可以写成 c1=c1+A-a;*/*/c2=c2-32;c2=c2-32;printf(“printf(“c c cc,c1,c2c1,c2););oo说明:说明:说明:说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。语言允许字符数据与整数直接进行算术运算。o运行结果:运行结果:第49页,此课件共96页哦 3.5 字符型数据说明:说明:有些系统(如Turbo C)将字符变量定义为signed char型。其存储单元中的最高位作为符号位,它的取值范围是-128127。如果在字符变量中存放一个ASCII码为0127间的字符,由于字节中最高位为0,因此用%d输出字符变量时,输出的是一个正整数。如果在字符变量中存放一个ASCII码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。第50页,此课件共96页哦 3.5 字符型数据3.5.4字符串常量字符串常量o字符串常量是一对双撇号括起来的字符序列.o合法的字符串常量:“How do you do.”,“CHINA”,“a”,“$123.45”o可以输出一个字符串,如printf(“How do you do.”);第51页,此课件共96页哦 3.5 字符型数据 是字符常量,”是字符串常量,二者不同。如:如:假设c被指定为字符变量:char c c=a;c=a;c=CHINA;结论:结论:不能把一个字符串常量赋给一个字符变量。第52页,此课件共96页哦o规定:在每一个字符串常量的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。规定以字符0作为字符串结束标志。如:如:如果有一个字符串常量,实际上在内存中是:CHINA0 它占内存单元不是个字符,而是个字符,最后一个字符为0。但在输出时不输出0。3.5 字符型数据第53页,此课件共96页哦 3.6 变量赋初值(1)语言允许在定义变量的同时使变量初始化如如:int a=3;/*指定为整型变量,初值为*/float f=3.56;/*指定为浮点型变量,初值为.56*/char c=a;/*指定为字符变量,初值为a*/第54页,此课件共96页哦 3.6 变量赋初值(2)可以使被定义的变量的一部分赋初值。如如:int a,b,c=5;表示指定、为整型变量,但只对初始化,c的初值为(3)如果对几个变量赋以同一个初值,应写成:int a=3,b=3,c=3;表示、的初值都是。不能写成 int a=b=c=3;注意:注意:初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。第55页,此课件共96页哦 3.7 各类数值型数据间的混合运算 混合运算:整型(包括int,short,long)、浮点型(包括float,double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.说明:这种类型转换是由系统自动进行的。第56页,此课件共96页哦 3.8 算术运算符和算术表达式3.8.1 运算符简介运算符简介 的运算符有以下几类:的运算符有以下几类:(1)算术运算符(+-*/%)(2)关系运算符(=!=)(3)逻辑运算符(!&|)(4)位运算符 (|)(5)赋值运算符(及其扩展赋值运算符)(6)条件运算符(?:)(7)逗号运算符 (,)第57页,此课件共96页哦 3.8 算术运算符和算术表达式(8)指针运算符(*和)(9)求字节数运算符(sizeof)(10)强制类型转换运算符((类型))(11)分量运算符(-)(12)下标运算符()(13)其他(如函数调用运算符()第58页,此课件共96页哦 3.8 算术运算符和算术表达式3.8.2 算术运算符和算术表达式算术运算符和算术表达式(1)(1)基本的算术运算符基本的算术运算符:o (加法运算符,或正值运算符。如:+、+)o (减法运算符,或负值运算符。如:-、-)o*(乘法运算符。如:*)o (除法运算符。如:/)o (模运算符,或称求余运算符,两侧均应为整型数据,如:的值为)。第59页,此课件共96页哦 3.8 算术运算符和算术表达式(2)(2)算术表达式和运算符的优先级与结合性基本的算算术表达式和运算符的优先级与结合性基本的算术运算符术运算符:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。例如例如:*.5a 是一个合法的表达式第60页,此课件共96页哦o语言规定了运算符的优先级和结合性。在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。o规定了各种运算符的结合方向(结合性)算术运算符的结合方向为“自左至右”,即先左后右。3.8 算术运算符和算术表达式第61页,此课件共96页哦 3.8 算术运算符和算术表达式(3)(3)强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。一般形式:(类型名)(表达式)例如:例如:o(double)将转换成double类型o(int)(x+y)将x+y的值转换成整型o(float)(5%3)将5%3的值转换成float型第62页,此课件共96页哦例3.8 强制类型转换。#include#include voidvoid main()main()float float x;x;intint i;i;x=3.6;x=3.6;i=(int)x;i=(int)x;/*/*如要四舍五入,应写成如要四舍五入,应写成 i=(int)(x+0.5);*/*/printf(x=%f printf(x=%f,i=%dn i=%dn,x x,i);i);oo说明:说明:说明:说明:有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。o运行结果:运行结果:x3.600000,i=3第63页,此课件共96页哦 3.8 算术运算符和算术表达式(4)(4)自增、自减运算符自增、自减运算符 作用是使变量的值增或减如如:o+i或-i在使用之前,先使的值加(减)oi+或i在使用之后,使的值加(减)o单独一个语句的情况下,以下这两种写法没有区别:i+;+i;第64页,此课件共96页哦 3.8 算术运算符和算术表达式i+i+与与+i+i的区别:的区别:是先执行后,再使用的值;是先使用的值后,再执行。无论+前置还是后置,i的值总是会被加1例如,假定例如,假定i i原值为原值为3 3:;i的值先变成4,再赋给,j的值变为 ;先将i的值3赋给,的值为,然后变为第65页,此课件共96页哦 3.8 算术运算符和算术表达式注意:注意:(1)自增运算符(),自减运算符(),只能用于变量,而不能用于常量或表达式,(2)和的结合方向是“自右至左”。自增(减)运算符常用于循环语句中使循环变量自动加。也用于指针变量,使指针指向下一个地址 第66页,此课件共96页哦 3.8 算术运算符和算术表达式(5)(5)有关表达式使用中的问题说明有关表达式使用中的问题说明 ANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。例如:对表达式 a=f1()+f2()并不是所有的编译系统都先调用f1(),然后调用f2()。在有的情况下结果可能不同。有时会出现一些令人容易搞混的问题,因此务必要小心谨慎。第67页,此课件共96页哦 3.8 算术运算符和算术表达式语言中有的运算符为一个字符,有的运算符由两个字符组成,为避免误解,最好采取大家都能理解的写法。例如:不要写成i+j的形式,而应写成 (i+)+j或者 i+j或者 i+j第68页,此课件共96页哦 3.8 算术运算符和算术表达式在调用函数时,实参数的求值顺序,标准并无统一规定。例如:例如:的初值为,如果有下面的函数调用:printf(,i+)在有的系统中,从左至右求值,输出“,”。在多数系统中对函数参数的求值顺序是自右而左,printf函数输出的是“,”。以上这种写法不宜提倡,最好改写成 j=i+;j=i+;printf(“%d printf(“%d,%d”%d”,j j,i)i);第69页,此课件共96页哦 3.9 赋值运算符和赋值表达式(1)(1)赋值运算符赋值运算符 赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“”的作用是执行一次赋值操作(或称赋值运算)。把常量赋给变量。也可以将一个表达式的值赋给一个变量。第70页,此课件共96页哦 3.9 赋值运算符和赋值表达式 (2)(2)类型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分。如如:为整型变量,执行“i=3.56”的结果是使的值为,以整数形式存储在整型变量中。当然,不出意外的,此时编译器会给出一个警告错误,提醒你这种赋值将导致精度丢失。第71页,此课件共96页哦 3.9 赋值运算符和赋值表达式 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中 如如:o将23赋给float变量,即执行23,先将23转换成2300000,再存储在中。o将23赋给double型变量,即执行23,系统将23补足有效位数字为2300000000000000,然后以双精度浮点数形式存储到变量中。第72页,此课件共96页哦 3.9 赋值运算符和赋值表达式 将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(4个字节)中。但应注意数值范围不能溢出。如如:float f;double d=123.456789e100;f=d;就出现溢出的错误。如果将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以8个字节存储第73页,此课件共96页哦 3.9 赋值运算符和赋值表达式 字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为个字节,因此将字符数据(个二进位)放到整型变量存储单元的低位中,高8位如何填充则要看具体情况:第74页,此课件共96页哦第一种情况:低位对应、高位补零低位对应、高位补零 若所用系统将字符处理为无符号字符类型,或程序已将字符变量定义为unsigned char型,则将字符的位放到整型变量低位,高位补零。例例如:如:将字符将字符376赋给赋给int型变量型变量第二种情况:符号扩展符号扩展 若所用系统(如Turbo C+)将字符处理为带符号(signed char)时,若字符最高位为,则整型变量高位补;若字符最高位为,则高位全补。这称为“符号扩展”,这样做的目的是使数值保持不变,如变量(字符376)以整数形式输出为,的值也是。第75页,此课件共96页哦 3.9 赋值运算符和赋值表达式 将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。例如:例如:int i=289;char c=a;c=i;c的值为33,如果用“%c”输出c,将得到字符“!”!的ASCII码为33。赋值情况赋值情况:第76页,此课件共96页哦 3.9 赋值运算符和赋值表达式 将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中:o如果int型数据为正值(符号位为),则long型变量的高16位补;o如果int型变量为负值(符号位为),则long型变量的高16位补,以保持数值不改变。反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。第77页,此课件共96页哦 3.9 赋值运算符和赋值表达式 例如:例如:int a;long b=8;a=b;赋值情况如下赋值情况如下:如果65536(八进制数0200000),则赋值后值为。第78页,此课件共96页哦 3.9 赋值运算符和赋值表达式 将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补即可。将一个unsigned类型数据赋给一个占字节数相同的非unsigned型整型变量(例如:unsigned int -int,unsigned long-long,unsigned short-short),将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。第79页,此课件共96页哦 3.9 赋值运算符和赋值表达式 例如:例如:unsigned int=65535;int b;=;将整个送到中,由于是int,第位是符号位,因此b成了负数。根据补码知识可知,的值为-1,可以用printf(%d,b);来验证。将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(符号位也作为数值一起传送)。第80页,此课件共96页哦例3.9 有符号数据传送给无符号变量。#include#include void mainvoid main()()unsigned unsigned;int int;print print(nn,);,);oo说明:说明:说明:说明:“%u”是输出无符号数时所用的格式符。如果为正值,且在32767之间,则赋值后数值不变。o运行结果:运行结果:第81页,此课件共96页哦总结一下C语言整数整数之间如何相互赋值oC语言的整数有1字节(char),2字节(short),4字节(long)四种长度;o假设执行A=B,C语言会首先将B和A