论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C语言程序设计(第2章 数据类型、运算符和表达式)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:19:50

2.1 C语言的数据类型
2.2 常量与变量
    2.2.1 标识符命名
    2.2.2 常量
    2.2.3 变量
2.3 整型数据
    2.3.1 整型常量
    2.3.2 整型变量
2.4 实型数据
    2.4.1 实型常量
    2.4.2 实型变量
2.5 字符型数据
    2.5.1 字符常量
    2.5.2 字符串常量
    2.5.3 转义字符 
    2.5.4 符号常量
    2.5.5 字符变量

2.6 运算符  
    2.6.1 算术运算符
    2.6.2 自增和自减
    2.6.3 关系和逻辑运算符





2.1 C语言的数据类型
C语言有五种基本数据类型:字符、整型、单精度实型、双精度实型和空类型。尽管这几种类型数据的长度和范围随处理器的类型和C语言编译程序的实现而异,但以b i t为例,整数与C P U字长相等,一个字符通常为一个字节,浮点值的确切格式则根据实现而定。对于多数微机,表2 - 1给出了五种数据的长度和范围。

表2-1 基本类型的字长和范围
类型 长度(bit) 范围
char(字符型) 8 0~255
int(整型) 16 -32768~32767
float(单精度型) 32 约精确到6位数
double(双精度型) 64 约精确到12位数
void (空值) 0 无值

表中的长度和范围的取值是假定CPU的字长为16 bit。
C语言还提供了几种聚合类型(aggregate types),包括数组、指针、结构、共用体(联合)、位域和枚举。这些复杂类型在以后的章节中讨论。
除void类型外,基本类型的前面可以有各种修饰符。修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。修饰符如下:
• signed(有符号)。
• unsigned(无符号)。
• long(长型符)。
• short(短型符)。
修饰符signed、short、long和unsigned适用于字符和整数两种基本类型,而long还可用于double(注重,由于long float与double意思相同,所以ANSI标准删除了多余的long float)。

表2 - 2给出所有根据ANSI标准而组合的类型、字宽和范围。切记,在计算机字长大于1 6位的系统中, short int与signed char可能不等。

表2-2 ANSI标准中的数据类型
类型 长度(bit) 范围
char(字符型 8 ASCII字符
unsigned char(无符号字符    8 0~255
signed char(有符号字符型) 8 -128~127
int(整型) 16 -32768~32767
unsigned int(无符号整型) 16 0~65535
signed int(有符号整型) 16 同 int         
short(短整型) 8             -128~127
unsigned short int(无符号短整型) 8 0~255
signed short int(有符号短整型)        8 同short int
long int(长整型) 32 2147483648~2147483649
signed long int(有符号长整型) 32 2147483648~2147483649
unsigned long int(无符号长整型) 32           0~4294967296
float(单精度型) 32 约精确到6位数
double(双精度型) 64 约精确到12位数

*表中的长度和范围的取值是假定CPU的字长为16 bit。
    因为整数的缺省定义是有符号数,所以singed这一用法是多余的,但仍答应使用。某些实现答应将unsigned用于浮点型,如unsigned double。但这一用法降低了程序的可移植性,故建议一般不要采用。
为了使用方便,C编译程序答应使用整型的简写形式:
• short int 简写为short。
• long int 简写为long。
• unsigned short int 简写为unsigned short。
• unsigned int 简写为unsigned。
• unsigned long int 简写为unsigned long。
即,int可缺省。

2.2 常量与变量
2.2.1 标识符命名
在C语言中,标识符是对变量、函数标号和其它各种用户定义对象的命名。标识符的长度可以是一个或多个字符。绝大多数情况下,标识符的第一个字符必须是字母或下划线,随后的字符必须是字母、数字或下划线(某些C语言编译器可能不答应下划线作为标识符的起始字符)。
下面是一些正确或错误标识符命名的实例。
正确形式        错误形式
count            2count
test23          hi!there
high_balance    high..balance
ANSI标准规定,标识符可以为任意长度,但外部名必须至少能由前8个字符唯一地区分。
这里外部名指的是在链接过程中所涉及的标识符,其中包括文件间共享的函数名和全局变量名。这是因为对某些仅能识别前8个字符的编译程序而言,下面的外部名将被当作同一个标识符处理。
counters       counters1     counters2
ANSI标准还规定内部名必须至少能由前31个字符唯一地区分。内部名指的是仅出现于定义该标识符的文件中的那些标识符。
C语言中的字母是有大小写区别的,因此count Count COUNT是三个不同的标识符。
标识符不能和C语言的要害字相同,也不能和用户已编制的函数或C语言库函数同名。

2.2.2 常量
C语言中的常量是不接受程序修改的固定值,常量可为任意数据类型,如下例所示:
数据类型             常量举例
char                'a'、'\n'、'9'
int                 21、123 、2100 、-234
long int            35000、 -34
short int           10、-12、90
unsigned int        10000、987、40000
float               123.23、4.34e-3
double              123.23、12312333、-0.9876234
     C语言还支持另一种预定义数据类型的常量,这就是串。所有串常量括在双撇号之间,例如"This is a test"。切记,不要把字符和串相混淆,单个字符常量是由单撇号括起来的,如'a'。

2.2.3 变量
    其值可以改变的量称为变量。一个变量应该有一个名字(标识符),在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注重区分变量名和变量值这两个不同的概念。所有的C变量必须在使用之前定义。定义变量的一般形式是:
type variable_list;
这里的type必须是有效的C数据类型,variable_list(变量表)可以由一个或多个由逗号分隔的多个标识符名构成。下面给出一些定义的范例。
int i, j, l;
short int si;
unsigned int ui;
double balance, profit,loss;
注重C语言中变量名与其类型无关。

2.3 整型数据
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                0X8 4
32179        076663              0X7db3或0X7DB3

    整常数在不加非凡说明时总是正值。假如需要的是负值,则负号“ -”必须放置于常数表达式的前面。
每个常数依其值要给出一种类型。当整常数应用于一表达式时,或出现有负号时,常数类型自动执行相应的转换,十进制常数可等价于带符号的整型或长整型,这取决于所需的常数的尺寸。
    八进制和十六进制常数可对应整型、无符号整型、长整型或无符号长整型,具体类型也取决于常数的大小。假如常数可用整型表示,则使用整型。假如常数值大于一个整型所能表示的最大值,但又小于整型位数所能表示的最大数,则使用无符号整型。同理,假如一个常数比无符号整型所表示的值还大,则它为长整型。假如需要,当然也可用无符号长整型。
    在一个常数后面加一个字母l或L,则认为是长整型。如10L、79L、012L、0115L、0XAL、0x4fL等。

2.3.2 整型变量
    前面已提到, C规定在程序中所有用到的变量都必须在程序中指定其类型,即“定义”。
    这是和BASIC、FORTRAN不同的,而与Pascal相似。
[例2 - 1 ]
main( )
{
    int a,b,c,d; / *指定a , b , c , d 为整型变量* /
    unsigned u; / *指定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
可以看到不同类型的整型数据可以进行算术运算。在本例中是i n t型数据与unsingned int型数据进行相加减运算。

2.4 实型数据
2.4.1 实型常量
   
实型常量又称浮点常量,是一个十进制表示的符号实数。符号实数的值包括整数部分、尾数部分和指数部分。实型常量的形式如下:
    [digits] [.digits] [ E|e[ + | - ] digits]
    在此digits是一位或多位十进制数字(从0~9)。E(也可用e)是指数符号。小数点之前是整数部分,小数点之后是尾数部分,它们是可省略的。小数点在没有尾数时可省略。
    指数部分用E或e开头,幂指数可以为负,当没有符号时视为正指数的基数为1 0,如1.575E10表示为:1.575×101 0。在实型常量中不得出现任何空白符号。
    在不加说明的情况下,实型常量为正值。假如表示负值,需要在常量前使用负号。
    下面是一些实型常量的示例:
    15.75, 1.575E10, 1575e-2, -0.0025, -2.5e-3, 25E-4
    所有的实型常量均视为双精度类型。
    实型常量的整数部分为0时可以省略,如下形式是答应的:
    .57, .0075e2, -.125, -.175E-2 。
    注重字母E或e之前必须有数字,且E或e后面指数必须为整数,如e 3、2 . 1 e 3 . 5、. e 3、e
等都是不合法的指数形式。

2.4.2 实型变量
   
实型变量分为单精度( f l o a t型)和双精度( d o u b l e型)。对每一个实型变量都应再使用前加以定义。如:
float x,y; / *指定x , y为单精度实数* /
double z; / *指定z为双精度实数* /
    在一般系统中,一个float型数据在内存中占4个字节( 3 2位)一个double型数据占8个字节(6 4位)。单精度实数提供7位有效数字,双精度提供1 5 ~ 1 6位有效数字,数值的范围随机器系统而异。
    值得注重的是,实型常量是double型,当把一个实型常量赋给一个float型变量时,系统会截取相应的有效位数。例如
float a;
a = 111111.111;
由于float型变量只能接收7位有效数字,因此最后两位小数不起作用。假如将a改为double型,则能全部接收上述9位数字并存储在变量a中。

2.5 字符型数据
2.5.1 字符常量
   
字符常量是指用一对单引号括起来的一个字符。如‘ a’,‘9’,‘!’。字符常量中的单引号只起定界作用并不表示字符本身。单引号中的字符不能是单引号(’)和反斜杠( \),它们特有的表示法在转义字符中介绍。
    在C语言中,字符是按其所对应的A S C I I码值来存储的,一个字符占一个字节。例如:
    字符          ASCII码值(十进制)
     !                3 3
     0                4 8
     1                4 9
     9                5 7
     A                6 5
     B                6 6
     a                9 7
     b                9 8
注重字符'9'和数字9的区别,前者是字符常量,后者是整型常量,它们的含义和在计算机中的存储方式都截然不同。
由于C语言中字符常量是按整数( s h o r t型)存储的,所以字符常量可以像整数一样在程序中参与相关的运算。例如:
'a'-32 ; /* 执行结果97-32 = 65 * /
'A' + 32; /* 执行结果65+32 = 97 * /
'9'-9; /* 执行结果57-9 = 48 * /

2.5.2 字符串常量
    
字符串常量是指用一对双引号括起来的一串字符。双引号只起定界作用,双引号括起的字符串中不能是双引号( ")和反斜杠(\),它们特有的表示法在转义字符中介绍。例如:
"China" ,"C program", "YES&NO", "33312-2341", "A" 等。
     C语言中,字符串常量在内存中存储时,系统自动在字符串的末尾加一个“串结束标志”,即ASCII码值为0的字符NULL,常用\0表示。因此在程序中,长度为n个字符的字符串常量,在内存中占有n + 1个字节的存储空间。
    例如,字符串China有5个字符,作为字符串常量" China "存储于内存中时,共占6个字节,系统自动在后面加上NU LL字符,其存储形式为:
C h i n a NULL

要非凡注重字符串与字符串常量的区别,除了表示形式不同外,其存储性质也不相同,字符'A'只占1个字节,而字符串常量"A"占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程序中使用转义字符\ d d d或者\ x h h可以方便灵活地表示任意字符。\ d d d为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制A S C I I码值。\ x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制A S C I I码值。
    使用转义字符时需要注重以下问题:
1) 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
2) \v 垂直制表和\f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
3) 在C程序中,使用不可打印字符时,通常用转义字符表示。

2.5.4 符号常量
    C语言答应将程序中的常量定义为一个标识符,称为符号常量。符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。符号常量在使用前必须先定义,定义的形式是:
#define <符号常量名> <常量>
例如:
#define PI  3.1415926
#define TRUE   1
#definr FALSE  0
#define STAR  '*'
    这里定义PI、TRUE、FLASE、STAR为符号常量,其值分别为3.1415926,1,0,'*'。
    #define是C语言的预处理命令,它表示经定义的符号常量在程序运行前将由其对应的常量替换。
    定义符号常量的目的是为了提高程序的可读性,便于程序的调试和修改。因此在定义符号常量名时,应使其尽可能地表达它所代表的常量的含义,例如前面所定义的符号常量名PI(p),表示圆周率3.1415926。此外,若要对一个程序中多次使用的符号常量的值进行修改,只须对预处理命令中定义的常量值进行修改即可。

2.5.5 字符变量
字符变量用来存放字符常量,注重只能存放一个字符,不要以为在一个字符变量中可以放字符串。
字符变量的定义形式如下:
char c1, c2;
它表示c 1和c 2为字符变量,各放一个字符。因此可以用下面语句对c 1、c 2赋值:
c1 = 'a'; c2 = 'b';

[例2 - 2 ]
main( )
{
    char c1,c2;
    c1 = 97; c2 = 98 ;
    printf("%c %c",c1,c2);
}
c1、c2被指定为字符变量。但在第3行中,将整数9 7和9 8分别赋给c 1和c 2,它的作用相当于以下两个赋值语句:
c1 = 'a' ; c2 = 'b' ;
因为'a'和'b'的ASCII码为97和98。第4行将输出两个字符。"%c"是输出字符的格式。程序输出:

a b

[例2 - 3 ]
main( )
{
    char c1,c2;
    c1 = 'a';c2 = 'b';
    c1 = c1 - 32; c2 =c2 - 32;
    printf( "%c  %c" , c1,c2);
}
运行结果为:
A B
它的作用是将两个小写字母转换为大写字母。因为'a'的ASCII码为97,而'A'为65,'b'为98,'B'为66。从ASCII代码表中可以看到每一个小写字母比大写字母的ASCII码大32。即'a'='A' + 32。

2.6 运算符
    C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外, C还有一些非凡的运算符,用于完成一些非凡的任务。

2.6.1 算术运算符
    表2 - 5列出了C语言中答应的算术运算符。在C语言中,运算符“ +”、“-”、“*”和“ /”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“ /”被用于整数或字符时,结果取整。例如,在整数除法中, 1 0 / 3 = 3。
    一元减法的实际效果等于用- 1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。

表2-5 算术运算符
运算符 作用 运算符 作用
- 减法,也是一元减法 % 模运算
+ 加法 -- 自减(减1)
* 乘法 ++ 自增(增1)
/ 除法


下面是说明%用法的程序段。
int x,y;
x = 10;
y = 3;
printf("%d",x/y); /* 显示3 */
printf("%d",x%y) ; /* 显示1 ,整数除法的余数* /
x = 1 ;
y = 2 ;
printf("%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 = 1 0;
y = ++x;
此时,y = 11。假如程序改为:
x = 10 ;
y = x++ ;
则y = 10。在这两种情况下, x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。
    在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码要快得多,所以尽可能采用加1或减1运算符是一种好的选择。
下面是算术运算符的优先级:
最高   ++、--
       -(一元减)
       *、/、%
最低   +、-
    编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。

2.6.3 关系和逻辑运算符
    关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。
    关系和逻辑运算符概念中的要害是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1 (见表2 - 6 )。

表2-6 关系和逻辑运算符

关系运算符 含义 关系运算符 含义
> 大于 <= 小于或等于
>= 大于等于 == 等于
< 小于 != 不等于

逻辑运算符 含义
&&
||
!

表2 - 6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。
关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以假定是对表
达式10>( 1 + 12)的计算,当然,该表达式的结果为Flase。
在一个表达式中答应运算的组合。例如:
10>5&&!(10<9)||3<=4
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058