第7章基本类型_第1页
第7章基本类型_第2页
第7章基本类型_第3页
第7章基本类型_第4页
第7章基本类型_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基本类型基本类型1C C语言的基本(内置的)类型:语言的基本(内置的)类型: 整型(整型(intint):):longlong、shortshort和和unsignedunsigned 浮点型:浮点型:floatfloat,doubledouble和和long double long double 字符型(字符型(charchar) 布尔型(布尔型(_Bool (C99) _Bool (C99) )2有符号数:有符号数:二进制最高位二进制最高位(最左边)为符号位,(最左边)为符号位,0 0:整数,:整数,1 1:负数:负数 最大最大1616位整数:位整数:32,767 (232,767 (21

2、515 1) 1), 二进制表示形式二进制表示形式01111111111111110111111111111111。 最大最大3232位整数是位整数是0111111111111111111111111111111101111111111111111111111111111111,数值为数值为2,147,483,647 (22,147,483,647 (23131 1) 1)。无符号整数:无符号整数:最左边位是数值的一部分最左边位是数值的一部分 最大的最大的1616位无符号整数位无符号整数65,535 (265,535 (21616 1) 1)。 最大的最大的3232位无符号整数是位无符号整数是

3、4,294,967,295 (24,294,967,295 (23232 1) 1)。3整型变量整型变量默认默认有符号有符号无符号数:强制声明无符号数:强制声明unsigned类型。类型。无符号数:主要用于系统编程和低级的、无符号数:主要用于系统编程和低级的、与机器相关的应用。与机器相关的应用。4intint型通常有型通常有3232位,位,longlong位更多,位更多,shortshort位更少。位更少。有有/ /无符号无符号+ +三种长度三种长度( (关键字关键字) )产生产生6 6种种类型组合:类型组合:short intshort intunsigned short intunsign

4、ed short intintintunsigned intunsigned intlong intlong intunsigned long intunsigned long int关键字的顺序没有要求,关键字的顺序没有要求,“intint”也可也可以省略以省略long intlong int可以缩写为可以缩写为longlong。56 6种整型的取值范围随机器的不同而不种整型的取值范围随机器的不同而不同。同。 C C标准要求:标准要求: short intshort int、intint和和long intlong int中的每一种类型都中的每一种类型都要覆盖一个确定的最小取值范围。要覆盖一

5、个确定的最小取值范围。 其次,长度:其次,长度:long int=int=short intlong int=int=short int61616位机器上整型通常的取值范围:位机器上整型通常的取值范围: 类型类型 最小值最小值 最大值最大值short int(2Byte) 32,768 32,768 32,76732,767unsigned short int0 065,53565,535int32,76832,768 32,76732,767unsigned int0 0 65,53565,535long int(4byte)2,147,483,6482,147,483,6482,147,4

6、83,6472,147,483,647unsigned long int0 04,294,967,2954,294,967,29573232位机器上整型通常的取值范围:位机器上整型通常的取值范围: 类型类型 最小值最小值 最大值最大值short int(2byte)32,76832,768 32,767 32,767unsigned short int0 0 65,535 65,535int(4byte)2,147,483,6482,147,483,6482,147,483,6472,147,483,647unsigned int0 0 4,294,967,295 4,294,967,295l

7、ong int2,147,483,6482,147,483,6482,147,483,6472,147,483,647unsigned long int0 0 4,294,967,295 4,294,967,29586464位机器上整型通常的取值范围:位机器上整型通常的取值范围: 类型类型 最小值最小值 最大值最大值short int32,76832,768 32,767 32,767unsigned short int0 0 65,535 65,535int2,147,483,6482,147,483,6482,147,483,6472,147,483,647unsigned int0 0

8、4,294,967,295 4,294,967,295long int226363 2 2636311unsigned long int0 02 2646411上述取值范围并非上述取值范围并非C C标准强制标准强制标准库标准库 头文件头文件 可以找到可以找到定义了每种整数最大值和最小值的宏。定义了每种整数最大值和最小值的宏。9提供了两种附加的标准整型(至少提供了两种附加的标准整型(至少6464位):位):long long int 和和 unsigned long long int. .long long int 的取值范围通常是的取值范围通常是 2 26363 (9,223,372,036,

9、854,775,808) (9,223,372,036,854,775,808) 到到 2 26363 1 1 (9,223,372,036,854,775,807).(9,223,372,036,854,775,807).unsigned long long int int 的取值范围通的取值范围通常是常是 0 0 到到 2 26464 1 1 (18,446,744,073,709,551,615).(18,446,744,073,709,551,615).10常量是在程序中以文本形式出现的数。常量是在程序中以文本形式出现的数。 变量:温度变量:温度 常量:密度,圆周率,汇率常量:密度,圆

10、周率,汇率C C语言允许用十进制、八进制和十六进语言允许用十进制、八进制和十六进形式书写整型常量。形式书写整型常量。本质上?本质上?二进制二进制11八进制数:八进制数:0707编写。每一位表示一个编写。每一位表示一个8 8次幂。次幂。 237237八进制八进制 十进制数:十进制数:2 2 8 82 2 + 3 + 3 8 81 1 + 7 + 7 8 80 0 = 128 + 24 = 128 + 24 + 7 = 159+ 7 = 159。十六进制数:十六进制数:0909加上加上AFAF,AFAF分别分别10151015。 1AF 1AF 十六进制十六进制 十进制:十进制: 1 1 16 1

11、62 2 + 10 + 10 16 161 1 + 15 + 15 16 160 0 = 256 = 256 + 160 + 15 = 431+ 160 + 15 = 431。12十进制常量包含数字十进制常量包含数字0909,以非零数字开头以非零数字开头:15 255 32767八进制常量包含数字八进制常量包含数字0707,以零开头以零开头:017 0377 077777十六进制常量包含数字十六进制常量包含数字0909和字母和字母afaf(大小写均(大小写均可),可),以以0 x0 x开头开头:0 xf 0 xff 0 x7fff 0 xfF 0 xFF13不管什么进制,对数本身没有影响,不管

12、什么进制,对数本身没有影响,计算机只识二进制。计算机只识二进制。常量没有声明(大小)常量没有声明(大小)十进制常量通常:十进制常量通常: intint类型,类型, 超过超过intint范围,用范围,用long intlong int,还大,编译器,还大,编译器会将其作为会将其作为unsigned long int unsigned long int 来处理。来处理。八或十六进制:八或十六进制: 编译器将遍历编译器将遍历int, unsigned int, long int, unsigned int, long intint和和 unsigned long int unsigned long

13、int类型,直到找到类型,直到找到适合的表示常量的类型。适合的表示常量的类型。14常量后加上常量后加上字母字母L L(或(或l l):强制编译器:强制编译器把常量作为长整型数来处理:把常量作为长整型数来处理:15L 0377L 0 x7fffL常量后边加上常量后边加上字母字母U U(或(或u u),指明无符,指明无符号常量:号常量:15U 0377U 0 x7fffU常量长且无符号:常量长且无符号:组合字母组合字母L和和U:0 xffffffffUL字母字母L和和U的的顺序和大小写顺序和大小写都没有关系。都没有关系。15基本类型:整型、浮点型、字符、布尔基本类型:整型、浮点型、字符、布尔整型整

14、型 三种长度:三种长度:shortshort、intint、longlong、long long longC99longC99 符号:有符号:有/ /无无整型常量整型常量 十进制常量包含数字十进制常量包含数字0909,以非零数字开头以非零数字开头: 八进制常量包含数字八进制常量包含数字0707,以零开头以零开头: 十六进制常量包含数字十六进制常量包含数字0909和字母和字母afaf(大小写(大小写均可),均可),以以0 x0 x开头开头: 加加L L(或(或l l),加),加U U(或(或u u)16算术运算结果超出表示范围。算术运算结果超出表示范围。溢出表现跟操作数有无符号有关溢出表现跟操作

15、数有无符号有关有符号溢出,有符号溢出, 程序的行为是没有定义的(不确定的)。程序的行为是没有定义的(不确定的)。 无符号溢出时,掐头取尾无符号溢出时,掐头取尾 结果为正确结果模(余)除结果为正确结果模(余)除2 2n n的结果,的结果, n n:存储运算结果的位数。:存储运算结果的位数。17eg.两位十进制相加,结果取两位:两位十进制相加,结果取两位:56+78=134,取值,取值34无符号整数、短和长整型整数需要一些新的转换说无符号整数、短和长整型整数需要一些新的转换说明符。明符。无符号整数无符号整数,使用字母,使用字母u u、o o或或x x。unsigned int u;unsigned

16、 int u;scanf(“%u, &u); /scanf(“%u, &u); /十十printf(%u, u); printf(%u, u); scanf(%o, &u); /scanf(%o, &u); /八八printf(%o, u); printf(%o, u); scanf(%x, &u); /scanf(%x, &u); /十六十六printf(%x, u); printf(%x, u); 18短整型:在短整型:在d、o、u或或x前面加上前面加上字母字母h:short s; scanf(%hd, &s);printf(%hd, s);长长整型整型:在在d d、o o、u u或或x

17、x前面加上前面加上l l。长长长长整型整型:在在d d、o o、u u或或x x前面加上前面加上llll。19数列项或和可能数列项或和可能超出超出intint表示范围。表示范围。在在1616位位intint机器上,可能发生:机器上,可能发生:Enter integers (0 to terminate): Enter integers (0 to terminate): 10000 20000 30000 010000 20000 30000 0The sum is: The sum is: -5536-5536将变量改换成将变量改换成long intlong int型进行改进。型进行改进。2

18、0int main(void) long n, sum = 0; printf(This program sums a series of integers.n); printf(Enter integers (0 to terminate): ); scanf(%ld, &n); while (n != 0) sum += n; scanf(%ld, &n); printf(The sum is: %ldn, sum); return 0;21int n;long sum = 0;floatfloat:单精度浮点数:单精度浮点数doubledouble:双精度浮点数:双精度浮点数long d

19、oublelong double:扩展双精度浮点数:扩展双精度浮点数22floatfloat适合适合精度要求不严格精度要求不严格的浮点数。的浮点数。 doubledouble为大部分的程序为大部分的程序提供了足够的精提供了足够的精度。度。 long double long double 很少用到。很少用到。C C标准没有说明三种标准没有说明三种floatfloat具体精度,因具体精度,因为不同计算机存储浮点数的方法可以不为不同计算机存储浮点数的方法可以不同。同。 大多数现代计算机和工作站都遵循大多数现代计算机和工作站都遵循IEEE IEEE 754754标准。标准。23提供了两种主要的浮点数格

20、式:提供了两种主要的浮点数格式: float(32float(32位位) )和和double(64double(64位位) )。 数值以数值以科学计数法科学计数法的形势存储:的形势存储: 符号、指数和小数符号、指数和小数。floatfloat: 符号符号1 1位、指数位、指数8 8位(含位(含1 1位符号),小数部分位符号),小数部分2323位。最大值大约位。最大值大约3.40 3.40 10 103838, , 其中精度是其中精度是6 6个十进制数字。个十进制数字。 (223-1)e(27-1)(223-1)e(27-1)实际实际 小数小数2525,指数,指数6 6位位 (225-1)e(2

21、5-1)=33554431e31(225-1)e(25-1)=33554431e3124IEEEIEEE标准:标准: 类型类型 最小正值最小正值 最大值最大值 精度精度float 1.175491.17549 10 103838 3.402823.40282 10 103838 6 digits 6 digitsdouble 2.225072.22507 10 10308308 1.797691.79769 10 10308308 15 digits 15 digits不遵循不遵循IEEEIEEE标准的计算机上,该表无效。标准的计算机上,该表无效。在一些机器上,在一些机器上,floatfloa

22、t可以有和可以有和doubledouble相同相同的数值集合,或的数值集合,或double可以有和可以有和long double相同的数值。相同的数值。 25可以在可以在 中找到定义浮点型中找到定义浮点型特征的宏。特征的宏。C99C99提供:提供: 实浮点型实浮点型 复浮点型:复浮点型:float_Complexfloat_Complex、double_Complexdouble_Complex、long double_Complexlong double_Complex26如果有指数(如果有指数(1010的幂),必须在指数前的幂),必须在指数前放置字母放置字母E E(或(或e e)。)。符号

23、(符号(+ +或或- -)可以出现在字母)可以出现在字母E E(或(或e e)的后边。的后边。57.057.0的有效写法如下:的有效写法如下: 57.0 57. 57.0e0 57E0 5.7e1 57.0 57. 57.0e0 57E0 5.7e1 5.7e+1 .57e2 570.e-15.7e+1 .57e2 570.e-127默认情况下,以双精度数的形式存储。默认情况下,以双精度数的形式存储。只需单精度,常量末尾加只需单精度,常量末尾加F F(或(或f f)( (如如57.0F)57.0F)。以以long doublelong double格式存储,格式存储,常量末尾加常量末尾加L L

24、(或(或l l)( (如如57.0L)57.0L)。28单精度浮点数:用转换说明符单精度浮点数:用转换说明符%e%e、%f%f和和%g%g。double floatdouble float,在,在e e、f f或或g g前放置前放置字母字母l l:double d;double d;scanf(%lf, &d);scanf(%lf, &d);注意:注意:只能在只能在scanfscanf函数格式串中使用函数格式串中使用l l,不能在不能在printfprintf函数格式串中使用,函数格式串中使用,e e、f f和和g g可用来可用来格式输出格式输出floatfloat或或doubledouble

25、型值。型值。C99C99可加可加l l,但不起作,但不起作用用 l l控制控制scanfscanf读缓存读缓存long doublelong double,在,在e e、f f或或g g前放置前放置字母字母L L。scanf(%Lf, &d);scanf(%Lf, &d);printf(%Lf, d);printf(%Lf, d);29基本类型:整型、浮点型、字符、布尔基本类型:整型、浮点型、字符、布尔 整型整型 三种长度:三种长度:shortshort、intint、longlong、long long longC99longC99 符号:有符号:有/ /无无 读写:读写:%h/ld/u/o

26、/x%h/ld/u/o/x 浮点浮点 floatfloat、doubledouble、long doublelong double 读写:读写:%l/Le/f/g%l/Le/f/g 字符字符 本质上是整数(编码为本质上是整数(编码为8 8位二进制),位二进制),ASCIIASCII30字符如何显示?字符如何显示?printf(A);printf(A);1212* *8 8点阵点阵计算机用数字对字符编码计算机用数字对字符编码学号学号值可以根据计算机的不同而不同,因为值可以根据计算机的不同而不同,因为不同的机器可能会有不同的字符集。不同的机器可能会有不同的字符集。例如,考试座位号例如,考试座位号3

27、1最常用的字符集是最常用的字符集是ASCIIASCII ( (美国信息交美国信息交换标准码换标准码), ), 它用它用7 7位代码表示位代码表示128128个字个字符。符。 0-9:0110000-01110010-9:0110000-0111001 数字,数数字,数vsvs字,字,egeg,9 9和和99 A-Z:1000001-1011010A-Z:1000001-1011010ASCIIASCII常被扩展为常被扩展为8 8位代码用于表示位代码用于表示256256个字符代码,被称为个字符代码,被称为Latin-1Latin-1, ,提供一些提供一些西欧和许多非洲语言所需的字符。西欧和许多非

28、洲语言所需的字符。32ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符0NUT32(space)6496、1SOH33!65A97a2STX34”66B98b3ETX35#67C99c4EOT36$68D100d5ENQ37%69E101e6ACK38&70F102f7BEL39,71G103g8BS40(72H104h9HT41)73I105i10LF42*74J106j11VT43+75K107k12FF44,76L108l13CR45-77M109m14SO46.78N110n15SI47/79O111o16DLE48080P112p17DCI49181Q

29、113q18DC250282R114r19DC351383X115s20DC452484T116t21NAK53585U117u22SYN54686V118v23TB55787W119w24CAN56888X120 x25EM57989Y121y26SUB58:90Z122z27ESC59;9112328FS609412631US63?95127DEL33charchar型变量可赋值为任何单个字符:型变量可赋值为任何单个字符:char ch; ch = a; /* lower-case a */ch = A; /* upper-case A */ch = 0; /* zero */ch = ;

30、 /* space */注意,字符常量需要用注意,字符常量需要用单引号单引号括起来,括起来,而不是而不是双引号双引号。34C C语言按小整数的方式处理字符。语言按小整数的方式处理字符。 内存视角(本质),内存视角(本质),1 1字节的二进制序列字节的二进制序列(ASCIIASCII码)码) printf(“%d”,ch);printf(“%d”,ch);ASCIIASCII码:码:0000000 11111110000000 1111111(01270127) aa为为97, A97, A为为65, 065, 0为为48, 48, 为为3232。35以以ASCIIASCII码存贮字符:码存贮字

31、符:36char c1,c2;char c1,c2;c1=97,c2=98;c1=97,c2=98;printf(%c,%cn,c1,c2);printf(%c,%cn,c1,c2);printf(%d,%dn,c1,c2);printf(%d,%dn,c1,c2);运行结果运行结果: a,b: a,b 97,98 97,980110000101100001%c %d a 97显示显示97字符常量实际上是字符常量实际上是intint类型类型,而不是,而不是charchar类型。类型。 char ch =a;ch =97;char ch =a;ch =97; #define CH Adefine

32、 CH 65#define CH Adefine CH 6537 00 00 00 00 00 00 979797不用管,实际值相同不用管,实际值相同intint数值数值可以比较、算术运算计算,使用它对应可以比较、算术运算计算,使用它对应的整数值。的整数值。38eg. eg. 假设采用假设采用ASCIIASCII码字符集码字符集: :char ch;char ch;int i;int i;i = a; /i = a; /* * i is now 97 i is now 97 * */ /ch = 65; /ch = 65; /* * ch is now A ch is now A * */ /

33、ch = ch + 1; /ch = ch + 1; /* * ch is now B ch is now B * */ / ch+; /ch+; /* * ch is now C ch is now C * */ /39实现在字符间游走:实现在字符间游走:ch+ch+大小写转换:大小写转换:A(65)-A(65)-a(97)a(97),间,间隔隔3232A +32=aA +32=a32=a-A32=a-A转换因子转换因子测试测试ch是否是小写字母;是则转化对是否是小写字母;是则转化对应大写。应大写。if (a = ch & ch = z) ch = ch - a + A;/A-a=65-97

34、=-32具体数值随字符集而有所不同具体数值随字符集而有所不同, 程序使用程序使用, , , , 和和 = 来进行字符比来进行字符比较可能不易移植。较可能不易移植。40字符数的属性之好处:字符数的属性之好处: eg. foreg. for循环控制:循环控制:for (ch = A; ch = Z; ch+) for (ch = A; ch = Z; ch+) 字符数的属性之缺点:字符数的属性之缺点: 可能会导致编译器无法检查出来的错误。可能会导致编译器无法检查出来的错误。 导致编写出诸如导致编写出诸如a a * * b / c b / c的的无意义的表达式。无意义的表达式。 可能会妨碍程序的可移

35、植性可能会妨碍程序的可移植性 Eg,Eg,上述上述forfor语句利用语句利用A A到到Z Z连续编码连续编码41存在存在有符号和无符号有符号和无符号两种两种charchar类型。类型。signed char sch;signed char sch;unsigned char uch;unsigned char uch;有符号字符:有符号字符:128 127128 127,无符号型,无符号型字符:字符:02550255。一些编译器按有符号处理,一些编译器一些编译器按有符号处理,一些编译器按无符号。按无符号。大多数时候,没有太大关系,不用关心大多数时候,没有太大关系,不用关心。42整数类型整数类

36、型 charchar intint 枚举(有序集合):学校专业枚举(有序集合):学校专业浮点类型浮点类型 实数实数 复数复数43字符:字符: 普通字符:普通字符:0-90-9,a-za-z,A-ZA-Z等,等,常量书写:常量书写:单引号括起来单引号括起来 特殊字符:不可见、(无法打印的或键特殊字符:不可见、(无法打印的或键入),如入),如换行、制表符换行、制表符,需特殊表示法,需特殊表示法 n,tn,t转义序列呈现这类特殊符号转义序列呈现这类特殊符号 字符转义序列字符转义序列 数字转义序列数字转义序列44名称名称转义序列转义序列Alert (bell)Alert (bell)aBackspac

37、eBackspacebForm feedForm feedfNew lineNew linenCarriage returnCarriage returnrHorizontal tabHorizontal tabtVertical tabVertical tabvBackslashBackslashQuestion markQuestion mark?Single quoteSingle quoteDouble quoteDouble quote方便但表示范围有限(仅常用特殊字符)方便但表示范围有限(仅常用特殊字符) 不包含所有无法打印的不包含所有无法打印的ASCIIASCII字符,如字符,如

38、ESCESC 无法表示无法表示ASCIIASCII字符以外的字符,西欧、非洲等字符以外的字符,西欧、非洲等8 8位(位(256256)Latin-1Latin-1用编号表示用编号表示45可以表示任何字符。可以表示任何字符。格式:格式:?:字符的八进制或十六进制编码(非十进制):字符的八进制或十六进制编码(非十进制) 八进制:如八进制:如 33 33 或或 033 033。最多三位八进制数。最多三位八进制数 十六进制:如十六进制:如x1b x1b 或或x1Bx1B。最多两位十六进制数,。最多两位十六进制数,x x小写,十六进制数字不限大小写。小写,十六进制数字不限大小写。作为字符常量:单引号括起

39、来。作为字符常量:单引号括起来。141 141 0141=970141=97数字转义序列隐晦,数字转义序列隐晦,#define#define命名意义明确:命名意义明确:#define ESC 33#define ESC 33转义序列可嵌入字符串中使用。转义序列可嵌入字符串中使用。 “hellonhellon”46touppertoupper库函数:库函数: 小写字母转换成大写字母,小写字母转换成大写字母,tolowertolower反之:反之:ch = toupper(ch);/ch-a+Ach = toupper(ch);/ch-a+Atouppertoupper在在ctype.hctype

40、.h中声明中声明#include #include C C函数库提供了其他有用的字符处理函函数库提供了其他有用的字符处理函数。数。47scanfscanf和和printfprintf用转换说明符用转换说明符%c%c对单个字符读对单个字符读/ /写写:%c%c读字符不会跳过空白、回车等字符读字符不会跳过空白、回车等字符, ,读所有字符读所有字符。扫描行结束符(检查读入字符是否为换行符)。扫描行结束符(检查读入字符是否为换行符)。dodo scanf(“%c”, &ch); scanf(“%c”, &ch);while(ch != n);/dowhile(ch != n);/do循环循环循环结束后

41、循环结束后ch=ch=?chch读入行所有字符,只保留?读入行所有字符,只保留?如需跳过空白等字符,如需跳过空白等字符,%c%c前面加空格:前面加空格:scanf( %c, &ch);scanf( %c, &ch);48gechar()gechar()和和putchar()putchar()代替代替scanfscanf函数函数和和printfprintf函数读取字符。函数读取字符。格式:格式:putchar(ch);/printf(“%c”,ch)putchar(ch);/printf(“%c”,ch)ch = getchar();/scanf(“%c”,&ch)ch = getchar();

42、/scanf(“%c”,&ch)gechar()gechar()和和putchar()putchar()节约时间节约时间实现简单实现简单作为宏实现作为宏实现 #define getchar() getc(stdin)#define getchar() getc(stdin)49gechargechar还优于还优于scanf()scanf()函数函数返回字符返回字符ch=getchar();ch=getchar();scanf(scanf(“%c%c”,&ch),&ch)用用getchar()getchar()扫描行结束扫描行结束( (末尾末尾n)n):dodoch = getchar();ch

43、 = getchar();while (ch != n);while (ch != n);精简循环控制表达式调用精简循环控制表达式调用gechargechar函数:函数:while (ch = getchar() != n);while (ch = getchar() != n);50循环转换为循环转换为do ; while (ch = getchar() != do ; while (ch = getchar() != n);n);进一步转换为进一步转换为while (ch = getchar() != n) ;while (ch = getchar() != n) ;getchar()ge

44、tchar()至少执行一次至少执行一次甚至变量甚至变量chch都可以不需要:都可以不需要:while (getchar() != n) ;while (getchar() != n) ;类似等式代入类似等式代入51while (getchar() != n) len+;while (getchar() != n) len+;统计行统计行字符数字符数用用getchargetchar跳过若干空格,遇到第一个跳过若干空格,遇到第一个非空字符循环终止。非空字符循环终止。while(ch = getchar() = ) ;while(ch = getchar() = ) ;while(getchar()

45、 = ) ;while(getchar() = ) ;52例如,计算标准体重程序,性别例如,计算标准体重程序,性别“回车回车”printf(Enter an integer: );printf(Enter an integer: );scanf(%d, &i);scanf(%d, &i);printf(Enter a command: );printf(Enter a command: );command = getchar();command = getchar();scanfscanf爱剩饭爱剩饭 输入串不匹配格式串,退回缓冲区输入串不匹配格式串,退回缓冲区getchargetchar不挑

46、食不挑食 读入缓冲区任意字符读入缓冲区任意字符53Enter a message: Enter a message: Brevity is the Brevity is the soul of wit.soul of wit.Your message was 27 character(s) Your message was 27 character(s) long.long.长度包括长度包括空格和标点符号空格和标点符号,不含结尾换,不含结尾换行符。行符。可采用可采用scanfscanf或或getchargetchar函数读取字符,函数读取字符,大多数大多数C C程序员愿意采用程序员愿意采用ge

47、tchargetchar函数。函数。54#include int main(void) char ch; int len = 0; printf(Enter a message: ); ch = getchar(); while (ch != n) len+; ch = getchar(); printf(Your message was %d character(s) long.n, len); return 0;55while (getchar() != n)len+;计算机执行算术运算,通常要求操作数计算机执行算术运算,通常要求操作数具有相同的具有相同的位数位数和和存储方式存储方式。不同

48、类型操作数进行计算,不同类型操作数进行计算,C C编译器要编译器要先类型转换,方便硬件实现。先类型转换,方便硬件实现。 a a(1616位位intint)+b+b(3232位位long intlong int),),a a先转先转化成化成3232位位long intlong int intint与与floatfloat运算,将运算,将intint转换为转换为floatfloat。56隐式转换隐式转换:编译器自动处理的转换,无:编译器自动处理的转换,无需程序员介入。需程序员介入。显示转换显示转换:程序员使用强制运算符。:程序员使用强制运算符。57基本数据类型种类多,规则略微复杂基本数据类型种类多

49、,规则略微复杂 算术转换:算术转换:算术或逻辑表达式中操作数的算术或逻辑表达式中操作数的类型不同时类型不同时 赋值转换:赋值转换:赋值运算符右侧表达式和左侧赋值运算符右侧表达式和左侧变量的类型不匹配时。变量的类型不匹配时。 函数调用转换:函数调用转换:函数调用中使用的参数类函数调用中使用的参数类型与对应参数类型不匹配时。型与对应参数类型不匹配时。 函数返回转换:函数返回转换:returnreturn语句中表达式的类语句中表达式的类型和函数返回值的类型不匹配时。型和函数返回值的类型不匹配时。58多用于二元运算多用于二元运算,eg.,eg.float x;int i;float x;int i;x

50、 + i;x + i;iifloatfloat比比xxintint更安全。更安全。intintfloatfloat,几乎没什么损失。,几乎没什么损失。floatfloatintint,损失小数部分;更糟糕的,损失小数部分;更糟糕的是,如果(是,如果(x x超出超出intint表示范围),将得到没表示范围),将得到没有意义的结果。有意义的结果。59统一操作数类型:统一操作数类型:类型提升类型提升将相对将相对较狭小类型的操作数较狭小类型的操作数转换成转换成另一个操作另一个操作数的类型。数的类型。整型提升:整型提升:short intshort intintint。6061高高 float floa

51、t double long doubledouble long double unsigned long unsigned long long long unsigned unsigned低低 int charint char、short short 最好尽量避免使用无符号整数,最好尽量避免使用无符号整数,特别是不要把它和有符号整数混合使用。特别是不要把它和有符号整数混合使用。char c;short int s;int i;unsigned int u;long int l;unsigned long int ul;float f;double d;long double ld; i = i

52、 + c; /* cint */i = i + s; /* sint */u = u + i; /* iunsigned int */l = l + u; /* ulong int */ul = ul + l;/* lunsigned long int */f = f + ul; /* ulfloat */d = d + f; /* fdouble */ld = ld + d;/* dlong double */62v=exprv=expr:exprexpr左值左值v v的类型的类型char c;char c;int i;int i;float f;float f;double d;doubl

53、e d;i = c; /i = c; /* * c cint int * */ /f = i; /f = i; /* * i ifloat float * */ /d = f; /d = f; /* * f fdouble double * */ /63浮点数赋值给整型浮点数赋值给整型变量,削小数部分。变量,削小数部分。int i; i = 842.97; /* i is now 842 */i = 842.97; /* i is now -842 */exprexpr结果超出左值取值范围,掐头取尾:结果超出左值取值范围,掐头取尾:char c;c = 256+78;(0000 0001 01

54、00 1110)c = 10000; /* WRONG */i = 1.0e20; /* WRONG */f = 1.0e100; /* WRONG */64二进制编码,二进制编码,ASCIIASCII码码 实质上小整数实质上小整数操作:操作: printf(),%d, %cprintf(),%d, %c 赋值赋值 字符字符- -整型;整型; 整型-字符 比较比较 大小写转换:大小写转换:ch = ch + a- A;ch = ch + a- A; for(ch = A; ch = Z; ch+) for(ch = A; ch = Z; ch+) 算术算术 ch+;ch+; a a * * b

55、 / c b / c65字符转义序列字符转义序列 仅常用特殊字符,仅常用特殊字符,n,tn,t方便但表示范围有方便但表示范围有限()限()数字转义序列数字转义序列 ? ?:字符的八进制或十六进制编码(非十:字符的八进制或十六进制编码(非十进制)进制)66输入输入 scanfscanf,getchargetchar,getcgetc,输出输出 printfprintf,putcharputchar,putc;putc;大小写转换大小写转换 toupper(ch),tolower(ch);toupper(ch),tolower(ch); 67扫描行结束扫描行结束( (末尾末尾n)n):do do

56、ch = getchar();ch = getchar(); while (ch != n); while (ch != n);精简精简while (getchar() != n) ;while (getchar() != n) ;确定消息长度:确定消息长度:while (getchar() != n)len+;68需求:操作数类型不同需求:操作数类型不同 运算要求操作数具有相同位数和存储方式运算要求操作数具有相同位数和存储方式隐式,编译器自动隐式,编译器自动 算术算术 赋值赋值 函数调用函数调用 函数返回函数返回显示(强制),程序员使用强制运算符显示(强制),程序员使用强制运算符()()69

57、统一操作数类型:统一操作数类型:类型提升类型提升将相对将相对较狭小类型的操作数较狭小类型的操作数转换成转换成另一个操作另一个操作数的类型。数的类型。整型提升:整型提升:short intshort intintint。7071最好尽量避免使用无符号整数,最好尽量避免使用无符号整数,特别是不要把它和有符号整数混合使用。特别是不要把它和有符号整数混合使用。高高 float float double long doubledouble long double unsigned long unsigned long long long unsigned unsigned低低 int charint c

58、har、short short 隐式转换自动完成,更大程度控制类型隐式转换自动完成,更大程度控制类型转换需主动进行转换。转换需主动进行转换。 强制类型转换表达式格式如下:强制类型转换表达式格式如下:( ( 类型名类型名 ) ) 表达式表达式72求求floatfloat型值小数部分:型值小数部分:float f, frac_part;float f, frac_part;frac_part = f - (int) f;frac_part = f - (int) f;求均值求均值float average;float average;int sum, n;int sum, n;average =

59、(float)sum/n;average = (float)sum/n;73一元运算符,一元运算符,优先级高于二元运算符:优先级高于二元运算符:(float) sum / n解释为解释为(float) sum) / n其他方法可以实现同样的效果:其他方法可以实现同样的效果:average = sum / (float) n;average = (float) sum / (float) n;强制转任一操作数,其余隐式转换强制转任一操作数,其余隐式转换74使用强制类型转换来避免溢出:使用强制类型转换来避免溢出:long i;int j = 1000; i = j * j; /* overflow may occur */用强制类型转换来避免这个问题:用强制类型转换来避免这个问题:i = (long) j * j;语句语句i = (long) (j * j); /* WRONG */溢出在强制类型转换之前就已经发生了。溢出在强制类型转换之前就已经发生了。75#define#define创建一个布尔类型的宏:创建一个布尔类型的宏:#define BOOL int#define BOOL int更好方法更好方法类型定义类型定义给类型别名给类型别名:typedef int Bool;/(inttypedef int Bool;/(int别名别名Bool)Bool)Bool flag;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论