第2章C语言数据类型运算符和文档格式.docx
《第2章C语言数据类型运算符和文档格式.docx》由会员分享,可在线阅读,更多相关《第2章C语言数据类型运算符和文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
float(单精度型)
32
约精确到6位数
double(双精度型)
64
约精确到12位数
void(空值)
0
无值
表中的长度和范围的取值是假定CPU的字长为16bit。
C语言还提供了几种聚合类型(aggregatetypes),包括数组、指针、结构、共用体(联合)、位域和枚举。
这些复杂类型在以后的章节中讨论。
除void类型外,基本类型的前面可以有各种修饰符。
修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。
修饰符如下:
•signed(有符号)。
•unsigned(无符号)。
•long(长型符)。
•short(短型符)。
修饰符signed、short、long和unsigned适用于字符和整数两种基本类型,而long还可用于double(注重,由于longfloat与double意思相同,所以ANSI标准删除了多余的longfloat)。
表2-2给出所有根据ANSI标准而组合的类型、字宽和范围。
切记,在计算机字长大于16位的系统中,shortint与signedchar可能不等。
表2-2ANSI标准中的数据类型
长度(bit)
范围
char(字符型
8
ASCII字符
unsignedchar(无符号字符
0~255
signedchar(有符号字符型)
-128~127
unsignedint(无符号整型)
0~65535
signedint(有符号整型)
同int
short(短整型)
unsignedshortint(无符号短整型)
signedshortint(有符号短整型)
同shortint
longint(长整型)
2147483648~2147483649
signedlongint(有符号长整型)
unsignedlongint(无符号长整型)
0~4294967296
*表中的长度和范围的取值是假定CPU的字长为16bit。
因为整数的缺省定义是有符号数,所以singed这一用法是多余的,但仍答应使用。
某些实现答应将unsigned用于浮点型,如unsigneddouble。
但这一用法降低了程序的可移植性,故建议一般不要采用。
为了使用方便,C编译程序答应使用整型的简写形式:
•shortint简写为short。
•longint简写为long。
•unsignedshortint简写为unsignedshort。
•unsignedint简写为unsigned。
•unsignedlongint简写为unsignedlong。
即,int可缺省。
2.2.1标识符命名
在C语言中,标识符是对变量、函数标号和其它各种用户定义对象的命名。
标识符的长度可以是一个或多个字符。
绝大多数情况下,标识符的第一个字符必须是字母或下划线,随后的字符必须是字母、数字或下划线(某些C语言编译器可能不答应下划线作为标识符的起始字符)。
下面是一些正确或错误标识符命名的实例。
正确形式
错误形式
count
2count
test23
hi!
there
high_balance
high..balance
ANSI标准规定,标识符可以为任意长度,但外部名必须至少能由前8个字符唯一地区分。
这里外部名指的是在链接过程中所涉及的标识符,其中包括文件间共享的函数名和全局变量名。
这是因为对某些仅能识别前8个字符的编译程序而言,下面的外部名将被当作同一个标识符处理。
counters
counters1
counters2
ANSI标准还规定内部名必须至少能由前31个字符唯一地区分。
内部名指的是仅出现于定义该标识符的文件中的那些标识符。
C语言中的字母是有大小写区别的,因此countCountCOUNT是三个不同的标识符。
标识符不能和C语言的要害字相同,也不能和用户已编制的函数或C语言库函数同名。
2.2.2常量
C语言中的常量是不接受程序修改的固定值,常量可为任意数据类型,如下例所示:
数据类型
常量举例
char
'
a'
、'
\n'
9'
int
21、123、2100、-234
longint
35000、-34
shortint
10、-12、90
unsignedint
10000、987、40000
float
123.23、4.34e-3
double
123.23、12312333、-0.9876234
C语言还支持另一种预定义数据类型的常量,这就是串。
所有串常量括在双撇号之间,例如"
Thisisatest"
。
切记,不要把字符和串相混淆,单个字符常量是由单撇号括起来的,如'
2.2.3变量
其值可以改变的量称为变量。
一个变量应该有一个名字(标识符),在内存中占据一定的存储单元,在该存储单元中存放变量的值。
请注重区分变量名和变量值这两个不同的概念。
所有的C变量必须在使用之前定义。
定义变量的一般形式是:
typevariable_list;
这里的type必须是有效的C数据类型,variable_list(变量表)可以由一个或多个由逗号分隔的多个标识符名构成。
下面给出一些定义的范例。
inti,j,l;
shortintsi;
unsignedintui;
doublebalance,profit,loss;
注重C语言中变量名与其类型无关。
2.3.1整型常量
整型常量及整常数。
它可以是十进制、八进制、十六进制数字表示的整数值。
十进制常数的形式是:
digits
这里digits可以是从0到9的一个或多个十进制数位,第一位不能是0。
八进制常数的形式是:
0digits
在此,digits可以是一个或多个八进制数(0~7之间),起始0是必须的引导符。
十六进制常数是下述形式:
0xhdigits
0Xhdigits
这里hdigits可以是一个或多个十六进制数(从0~9的数字,并从“a”~“f”的字母)。
引导符0是必须有的,X即字母可用大写或小写。
注重,空白字符不可出现在整数数字之间。
表2-3列出了整常数的形式。
表2-3整常数的例子
十进制
八进制
十六进制
10
012
0Xa或0XA
132
0204
0X84
32179
076663
0X7db3或0X7DB3
整常数在不加非凡说明时总是正值。
假如需要的是负值,则负号“-”必须放置于常数表达式的前面。
每个常数依其值要给出一种类型。
当整常数应用于一表达式时,或出现有负号时,常数类型自动执行相应的转换,十进制常数可等价于带符号的整型或长整型,这取决于所需的常数的尺寸。
八进制和十六进制常数可对应整型、无符号整型、长整型或无符号长整型,具体类型也取决于常数的大小。
假如常数可用整型表示,则使用整型。
假如常数值大于一个整型所能表示的最大值,但又小于整型位数所能表示的最大数,则使用无符号整型。
同理,假如一个常数比无符号整型所表示的值还大,则它为长整型。
假如需要,当然也可用无符号长整型。
在一个常数后面加一个字母l或L,则认为是长整型。
如10L、79L、012L、0115L、0XAL、0x4fL等。
2.3.2整型变量
前面已提到,C规定在程序中所有用到的变量都必须在程序中指定其类型,即“定义”。
这是和BASIC、FORTRAN不同的,而与Pascal相似。
[例2-1]
main()
{
inta,b,c,d;
/*指定a,b,c,d为整型变量*/
unsignedu;
/*指定u为无符号整型变量*/
a=12;
b=-24;
u=10;
c=a+u;
d=b+u;
printf("
a+u=%d,b+u=%d\n"
c,d);
}
运行结果为:
a+u=22,b+u=-14
可以看到不同类型的整型数据可以进行算术运算。
在本例中是int型数据与unsingnedint型数据进行相加减运算。
2.4.1实型常量
实型常量又称浮点常量,是一个十进制表示的符号实数。
符号实数的值包括整数部分、尾数部分和指数部分。
实型常量的形式如下:
[digits][.digits][E|e[+|-]digits]
在此digits是一位或多位十进制数字(从0~9)。
E(也可用e)是指数符号。
小数点之前是整数部分,小数点之后是尾数部分,它们是可省略的。
小数点在没有尾数时可省略。
指数部分用E或e开头,幂指数可以为负,当没有符号时视为正指数的基数为10,如1.575E10表示为:
1.575×
1010。
在实型常量中不得出现任何空白符号。
在不加说明的情况下,实型常量为正值。
假如表示负值,需要在常量前使用负号。
下面是一些实型常量的示例:
15.75,1.575E10,1575e-2,-0.0025,-2.5e-3,25E-4
所有的实型常量均视为双精度类型。
实型常量的整数部分为0时可以省略,如下形式是答应的:
.57,.0075e2,-.125,-.175E-2。
注重字母E或e之前必须有数字,且E或e后面指数必须为整数,如e3、2.1e3.5、.e3、e
等都是不合法的指数形式。
2.4.2实型变量
实型变量分为单精度(float型)和双精度(double型)。
对每一个实型变量都应再使用前加以定义。
如:
floatx,y;
/*指定x,y为单精度实数*/
doublez;
/*指定z为双精度实数*/
在一般系统中,一个float型数据在内存中占4个字节(32位)一个double型数据占8个字节(64位)。
单精度实数提供7位有效数字,双精度提供15~16位有效数字,数值的范围随机器系统而异。
值得注重的是,实型常量是double型,当把一个实型常量赋给一个float型变量时,系统会截取相应的有效位数。
例如
floata;
a=111111.111;
由于float型变量只能接收7位有效数字,因此最后两位小数不起作用。
假如将a改为double型,则能全部接收上述9位数字并存储在变量a中。
2.5.1字符常量
字符常量是指用一对单引号括起来的一个字符。
如‘a’,‘9’,‘!
’。
字符常量中的单引号只起定界作用并不表示字符本身。
单引号中的字符不能是单引号(’)和反斜杠(\),它们特有的表示法在转义字符中介绍。
在C语言中,字符是按其所对应的ASCII码值来存储的,一个字符占一个字节。
例如:
字符
ASCII码值(十进制)
!
33
48
1
49
9
57
A
65
B
66
a
97
b
98
注重字符'
和数字9的区别,前者是字符常量,后者是整型常量,它们的含义和在计算机中的存储方式都截然不同。
由于C语言中字符常量是按整数(short型)存储的,所以字符常量可以像整数一样在程序中参与相关的运算。
'
-32;
/*执行结果97-32=65*/
A'
+32;
/*执行结果65+32=97*/
-9;
/*执行结果57-9=48*/
2.5.2字符串常量
字符串常量是指用一对双引号括起来的一串字符。
双引号只起定界作用,双引号括起的字符串中不能是双引号("
)和反斜杠(\),它们特有的表示法在转义字符中介绍。
"
China"
,"
Cprogram"
"
YES&
NO"
33312-2341"
A"
等。
C语言中,字符串常量在内存中存储时,系统自动在字符串的末尾加一个“串结束标志”,即ASCII码值为0的字符NULL,常用\0表示。
因此在程序中,长度为n个字符的字符串常量,在内存中占有n+1个字节的存储空间。
例如,字符串China有5个字符,作为字符串常量"
China"
存储于内存中时,共占6个字节,系统自动在后面加上NULL字符,其存储形式为:
C
h
i
n
NULL
要非凡注重字符串与字符串常量的区别,除了表示形式不同外,其存储性质也不相同,字符'
只占1个字节,而字符串常量"
占2个字节。
2.5.3转义字符
转义字符是C语言中表示字符的一种非凡形式。
通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号('
),用于表示字符串常量的双撇号("
)和反斜杠(\)等。
转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。
表2-4给出了C语言中常用的转义字符。
表2-4转义字符
转义字符
意义
ASCII码值(十进制)
\a
响铃(BEL)
007
\b
退格(BS)
008
\f
换页(FF)
012
\n
换行(LF)
010
\r
回车(CR)
013
\t
水平制表(HT)
009
\v
垂直制表(VT)
011
\
反斜杠
092
\?
问号字符
063
\'
单引号字符
039
\"
双引号字符
034
\0
空字符(NULL)
000
\ddd
任意字符
三位八进制
\xhh
二位十六进制
字符常量中使用单引号和反斜杠以及字符常量中使用双引号和反斜杠时,都必须使用转义字符表示,即在这些字符前加上反斜杠。
在C程序中使用转义字符\ddd或者\xhh可以方便灵活地表示任意字符。
\ddd为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制ASCII码值。
\x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制ASCII码值。
使用转义字符时需要注重以下问题:
1)转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
2)\v垂直制表和\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
3)在C程序中,使用不可打印字符时,通常用转义字符表示。
2.5.4符号常量
C语言答应将程序中的常量定义为一个标识符,称为符号常量。
符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。
符号常量在使用前必须先定义,定义的形式是:
#define<
符号常量名>
<
常量>
#definePI
3.1415926
#defineTRUE
1
#definrFALSE
#defineSTAR
*'
这里定义PI、TRUE、FLASE、STAR为符号常量,其值分别为3.1415926,1,0,'
#define是C语言的预处理命令,它表示经定义的符号常量在程序运行前将由其对应的常量替换。
定义符号常量的目的是为了提高程序的可读性,便于程序的调试和修改。
因此在定义符号常量名时,应使其尽可能地表达它所代表的常量的含义,例如前面所定义的符号常量名PI(p),表示圆周率3.1415926。
此外,若要对一个程序中多次使用的符号常量的值进行修改,只须对预处理命令中定义的常量值进行修改即可。
2.5.5字符变量
字符变量用来存放字符常量,注重只能存放一个字符,不要以为在一个字符变量中可以放字符串。
字符变量的定义形式如下:
charc1,c2;
它表示c1和c2为字符变量,各放一个字符。
因此可以用下面语句对c1、c2赋值:
c1='
;
c2='
b'
[例2-2]
charc1,c2;
c1=97;
c2=98;
%c%c"
c1,c2);
c1、c2被指定为字符变量。
但在第3行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:
;
因为'
和'
的ASCII码为97和98。
第4行将输出两个字符。
%c"
是输出字符的格式。
程序输出:
ab
[例2-3]
{
c1='
c2='
c1=c1-32;
c2=c2-32;
printf("
%c
c1,c2);
运行结果为:
AB
它的作用是将两个小写字母转换为大写字母。
的ASCII码为97,而'
为65,'
为98,'
B'
为66。
从ASCII代码表中可以看到每一个小写字母比大写字母的ASCII码大32。
即'
='
+32。
2.6运算符
C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。
C语言有三大运算符:
算术、关系与逻辑、位操作。
另外,C还有一些非凡的运算符,用于完成一些非凡的任务。
2.6.1算术运算符
表2-5列出了C语言中答应的算术运算符。
在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。
当“/”被用于整数或字符时,结果取整。
例如,在整数除法中,10/3=3。
一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。
模运算符“%”在C语言中也同它在其它语言中的用法相同。
切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。
表2-5算术运算符
运算符
作用
作用
-
减法,也是一元减法
%
模运算
+
加法
--
自减(减1)
*
乘法
++
自增(增1)
/
除法
下面是说明%用法的程序段。
intx,y;
x=10;
y=3;
printf("
%d"
x/y);
/*显示3*/
x%y);
/*显示1,整数除法的余数*/
x=1;
y=2;
%d,%d"
x/y,x%y);
/*显示0,1*/
最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。
2.6.2自增和自减
C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。
运算符“++”是操作数加1,而“--”是操作数减1,换句话说:
x=x+1;
同++x;
x=x-1;
同--x;
自增和自减运算符可用在操作数之前,也可放在其后,例如:
x=x+1;
可写成++x;
或x++;
但在表达式中这两种用法是有区别的。
自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;
运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。
请看下例:
x=10;
y=++x;
此时,y=11。
假如程序改为:
x=10;
y=x++