友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言设计-第4部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
制。它有二种形式:十进制小数形式,指数形式。
1) 十进制数形式:由数码 0~ 9 和小数点组成。
例如:
0。0、25。0、5。789、0。13、5。0、300。、…267。8230
等均为合法的实数。注意,必须有小数点。
2)
指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符
号)组成。
其一般形式为:
a E n(a 为十进制数,n 为十进制整数)
其值为 a*10n。
如:
2。1E5 (等于 2。1*105)
3。7E…2 (等于 3。7*10…2)
0。5E7 (等于 0。5*107)
…2。8E…2 (等于…2。8*10…2)
以下不是合法的实数:
345 (无小数点)
E7 (阶码标志 E 之前无数字)
…5 (无阶码标志)
53。…E3 (负号位置不对)
2。7E (无阶码)
谭浩强 C 语言程序设计 2001 年 5 月 1 日
标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如 356f 和 356。
是等价的。
【例 3。5】说明了这种情况。
main(){
printf(〃%fn 〃;356。);
printf(〃%fn 〃;356);
printf(〃%fn 〃;356f);
}
3。4。2 实型变量
1。 实型数据在内存中的存放形式
实型数据一般占 4 个字节(32 位)内存空间。按指数形式存储。实数 3。14159 在内存中
的存放形式如下:
+
数符
。314159
小数部分
1
指数
?
小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。
? 指数部分占的位数愈多,则能表示的数值范围愈大。
2。 实型变量的分类
实型变量分为:单精度(float 型)、双精度(double 型)和长双精度(long double 型)
三类。
在 Turbo C 中单精度型占 4 个字节(32 位)内存空间,其数值范围为 3。4E…38~3。4E+38,
只能提供七位有效数字。双精度型占 8 个字节(64 位)内存空间,其数值范围为 1。7E…308~
1。7E+308,可提供 16 位有效数字。
类型说明符 比特数(字节数) 有效数字
数的范围
float
double
long double
32(4)
64(8)
128(16)
6~7
15~16
18~19
10…37~1038
10…307~10308
10…4931~104932
实型变量定义的格式和书写规则与整型相同。
例如:
float x;y; (x;y 为单精度实型量)
double a;b;c; (a;b;c 为双精度实型量)
3。 实型数据的舍入误差
由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。如下例。
【例 3。6】实型数据的舍入误差。
main()
{float a;b;
a=123456。789e5;
b=a+20
printf(〃%fn〃;a);
}
printf(〃%fn〃;b);
注意:1。0/3*3 的结果并不等于 1。
谭浩强 C 语言程序设计 2001 年 5 月 1 日
【例 3。7】
main()
{
float a;
double b;
a=33333。33333;
b=33333。33333333333333;
printf(〃%fn%fn〃;a;b);
}
? 从本例可以看出,由于 a 是单精度浮点型,有效位数只有七位。而整数已占五位,
故小数二位后之后均为无效数字。
?
b 是双精度型,有效位为十六位。但 Turbo C 规定小数后最多保留六位,其余部
分四舍五入。
3。4。3 实型常数的类型
实型常数不分单、双精度,都按双精度 double 型处理。
3。5 字符型数据
字符型数据包括字符常量和字符变量。
3。5。1 字符常量
字符常量是用单引号括起来的一个字符。
例如:
'a'、'b'、'='、'+'、'?'
都是合法字符常量。
在C语言中,字符常量有以下特点:
1) 字符常量只能用单引号括起来,不能用双引号或其它括号。
2) 字符常量只能是单个字符,不能是字符串。
3) 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。
如'5'和 5 是不同的。'5'是字符常量,不能参与运算。
3。5。2 转义字符
谭浩强 C 语言程序设计 2001 年 5 月 1 日
转义字符是一种特殊的字符常量。转义字符以反斜线〃”开头,后跟一个或几个字符。
转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例
题 printf 函数的格式串中用到的“n”就是一个转义字符,其意义是“回车换行”。转义字符
主要用来表示那些用一般字符不便于表示的控制代码。
常用的转义字符及其含义
转义字符
n
t
b
r
f
'
”
a
ddd
xhh
转义字符的意义
回车换行
横向跳到下一制表位置
退格
回车
走纸换页
反斜线符〃”
单引号符
双引号符
鸣铃
1~3 位八进制数所代表的字符
1~2 位十六进制数所代表的字符
ASCII 代码
10
9
8
13
12
92
39
34
7
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表中的ddd 和xhh
正是为此而提出的。ddd 和 hh 分别为八进制和十六进制的 ASCII 代码。如101 表示字母〃A〃 ,
102 表示字母〃B〃,134 表示反斜线,XOA 表示换行等。
【例 3。8】转义字符的使用。
main()
{
int a;b;c;
a=5; b=6; c=7;
printf(“ ab ctderfn”);
printf(“hijktLbMn”);
}
3。5。3 字符变量
字符变量用来存储字符常量,即单个字符。
字符变量的类型说明符是 char。字符变量类型定义的格式和书写规则都与整型变量相
同。例如:
char a;b;
谭浩强 C 语言程序设计 2001 年 5 月 1 日
3。5。4 字符数据在内存中的存储形式及使用方法
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以 ASCII
码的形式存放在变量的内存单元之中的。
如 x 的十进制 ASCII 码是 120,y 的十进制 ASCII 码是 121。对字符变量 a;b 赋予'x'和'y'
值:
a='x';
b='y';
实际上是在 a;b 两个单元内存放 120 和 121 的二进制代码:
a:
0 1 1 1 1 0 0 0
b:
0 1 1 1 1 0 0 1
所以也可以把它们看成是整型量。C语言允许对整型变量赋以字符值,也允许对字符
变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。
整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字
节参与处理。
【例 3。9】向字符变量赋以整数。
main()
{
char a;b;
a=120;
b=121;
printf(〃%c;%cn〃;a;b);
printf(〃%d;%dn〃;a;b);
}
本程序中定义 a,b 为字符型,但在赋值语句中赋以整型值。从结果看,a,b 值的输出
形式取决于 printf 函数格式串中的格式符,当格式符为〃c〃时,对应输出的变量值为字符,当
格式符为〃d〃时,对应输出的变量值为整数。
【例 3。10】
main()
{
char a;b;
a='a';
b='b';
a=a…32;
b=b…32;
printf(〃%c;%cn%d;%dn〃;a;b;a;b);
}
谭浩强 C 语言程序设计 2001 年 5 月 1 日
本例中,a,b 被说明为字符变量并赋予字符值,C语言允许字符变量参与数值运算,
即用字符的 ASCII 码参与运算。由于大小写字母的 ASCII 码相差 32,因此运算后把小写字
母换成大写字母。然后分别以整型和字符型输出。
3。5。5 字符串常量
字符串常量是由一对双引号括起的字符序列。例如: 〃CHINA〃 , “C program” ,
〃12。5〃 等都是合法的字符串常量。
字符串常量和字符常量是不同的量。它们之间主要有以下区别:
1) 字符常量由单引号括起来,字符串常量由双引号括起来。
2) 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
3) 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变
量。在C语言中没有相应的字符串变量。这是与 BASIC 语言不同的。但是可以用
一个字符数组来存放一个字符串常量。在数组一章内予以介绍。
4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数
加 1。增加的一个字节中存放字符〃0〃 (ASCII 码为 0)。这是字符串结束的标志。
例如:
字符串 〃C program〃 在内存中所占的字节为:
C p r o g r a m 0
字符常量'a'和字符串常量〃a〃虽然都只有一个字符,但在内存中的情况是不同的。
'a'在内存中占一个字节,可表示为:
a
〃a〃在内存中占二个字节,可表示为:
a 0
3。6 变量赋初值
在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法为变量提
供初值。本小节先介绍在作变量定义的同时给变量赋以初值的方法。这种方法称为初始化。
在变量定义中赋初值的一般形式为:
类型说明符 变量 1= 值 1,变量 2= 值 2,……;
例如:
int a=3;
int b;c=5;
float x=3。2;y=3f;z=0。75;
char ch1='K';ch2='P';
应注意,在定义中不允许连续赋值,如 a=b=c=5 是不合法的。
【例 3。11】
main()
{
int a=3;b;c=5;
b=a+c;
printf(〃a=%d;b=%d;c=%dn〃;a;b;c);
}
谭浩强 C 语言程序设计 2001 年 5 月 1 日
3。7 各类数值型数据之间的混合运算
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转
换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以
下规则:
1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2) 转换按数据长度增加的方向进行,以保证精度不降低。如 int 型和 long 型运算时,
先把 int 量转成 long 型后再进行运算。
3) 所有的浮点运算都是以双精度进行的,即使仅含 float 单精度量运算的表达式,也
要先转换成 double 型,再作运算。
4) char 型和 short 型参与运算时,必须先转换成 int 型。
5) 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为
左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样
会降低精度,丢失的部分按四舍五入向前舍入。
下图表示了类型自动转换的规则。
double
long
unsigned
【例 3。12】
main(){
float PI=3。14159;
int s;r=5;
s=r*r*PI;
printf(〃s=%dn〃;s);
int
char;short
}
谭浩强 C 语言程序设计 2001 年 5 月 1 日
本例程序中,PI 为实型;s,r 为整型。在执行 s=r*r*PI 语句时,r 和 PI 都转换成 double
型计算,结果也为 double 型。但由于 s 为整型,故赋值结果仍为整型,舍去了小数部分。
强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float) a 把 a 转换为实型
(int)(x+y) 把 x+y 的结果转换为整型
在使用强制转换时应注意以下问题:
1) 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成
(int)x+y 则成了把 x 转换成 int 型之后再与 y 相加了。
2) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进
行的临时性转换,而不改变数据说明时对该变量定义的类型。
【例 3。13】
main(){
float f=5。75;
printf(〃(int)f=%d;f=%fn〃;(int)f;f);
}
本例表明,f 虽强制转为 int 型,但只在运算中起作用,是临时的,而 f 本身的类型并不
改变。因此,(int)f 的值为 5(删去了小数)而 f 的值仍为 5。75。
3。8 算术运算符和算术表达式
C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达
式使C语言功能十分完善。这也是C语言的主要特点之一。
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达
式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合
性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语
言的运算符所没有的,因此也增加了C语言的复杂性。
3。8。1 C 运算符简介
C语言的运算符可分为以下几类:
1。 算术运算符:用于各类数值运算。包括加(+)、减(…)、乘(*)、除(/)、求余(或称模运算,%)、
自增(++)、自减(……)共七种。
2。 关系运算符:用于比较运算。包括大于(》)、小于(=)、小于等
于(》=;
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!