2.1 数据类型

2.1.1 程序引例

【例2.1】已知一个圆的半径,求这个圆的周长和面积。

分析:如果用r代表圆的半径,用g代表圆的周长,用s代表圆的面积,用pi代表圆周率π,那么圆的周长公式是g=2pi*r,圆的面积公式是s=pi*r2。在这两个公式里,pi是圆周率,固定不变的,而半径r是可变的,则圆的周长与圆的面积也是可变的,那么,这些元素如何在C语言里进行说明并表示出来,这就是本节的重点内容。

程序代码如下:

图2-1 例2.1运行结果

运行结果如图2-1所示。

由图中可以看到,r的值为整数1,而g、s为小数形式,也就是说,r与g、s是不同的数据类型。那么C语言的数据类型是怎样规定的呢?

在C语言中,每个数据都属于唯一的一种数据类型,没有无类型的数据,C语言的数据类型如图2-2所示。

图2-2 C语言的数据类型

C语言的基本数据类型有三种:字符型、整型和实型(浮点型)。C语言的基本数据类型修饰符有四种:singed(有符号)、unsigned(无符号)、long(长型符)、short(短型符),这些类型修饰符可以与字符型或整型数据配合使用。基本数据类型和取值范围如表2-1所示。

表2-1 C语言常用基本数据类型描述

说明:C语言中,整型数据的取值范围随着程序编译系统的不同而不同。本书以C-Free 3.5作为程序调试环境。

2.1.2 标识符和关键字

所谓标识符是指用来标识程序中用到的变量名、函数名、类型名、数组名、文件名以及符号常量名等有效字符序列。

在C语言中,标识符的命名规则是:由字母(大小写皆可)、数字及下画线组成,且第一个字符必须是字母或下画线。

由上述的标识符命名规则可知,下面的标识符名是合法的:

year、_123、Int

而下面的标识符是非法的:

#123、1_2

所谓关键字又被称为保留字,它也是C语言的一种标识符,用来命名C语言程序中的语句、数据类型和变量属性等。每个关键字都有固有的含义,不能另做其他用途,C语言中的所有关键字都使用小写字母来表示。

2.1.3 常量

常量又称常数,是指在程序运行过程中其值不可改变的量。C语言中的常量可分整型常量、实型常量和字符型常量。

(1)整型常量

整型常量又称为整数,在C语言中,整数可以用三种数制来表示:

①十进制整型常量。十进制整型常量没有前缀,其数码为0~9。

②八进制整型常量。八进制整型常量必须以数字0开头,其数码取值范围为0~7。

③十六进制整型常量。十六进制整型常量的前缀为0X或0x。其数码取值范围为0~9、A~F或a~f。

(2)实型常量

实型也称为浮点型,实型常量也可称为实数或浮点数。在C语言中,实数采用十进制表示,它有两种形式:十进制小数形式和指数形式。

①十进制小数形式:小数形式是由数码0~9和小数点组成(注意:必须有小数点)。

②指数形式:指数形式又称科学计数法。其一般形式为:a E n(a表示十进制数,n表示指数),其数值为a×10n

注意:指数表示形式中E或e前后必须有数字,E或e后面的数字必须是整数。

【例2.2】整型常量和实型常量的输出。

第一个printf语句,以十进制形式输出用三种数制表示的整数,第二个printf语句,以小数形式和指数形式输出实数,运行结果如图2-3所示。

图2-3 例2.2运行结果

(3)字符型常量

字符型常量是用单引号括起来的一个字符。例如:'A'、'a'等。

在C语言中,字符型常量有以下特点:

①字符型常量只能用单引号括起来,不能使用双引号或其他括号。单引号是字符型常量的定界符,不是字符型常量的一部分。

②字符型常量只能存放一个字符,不能是多个字符。字符值以ASCII码的形式存放在内存单元中。数字被定义为字符型之后就不能参与数值运算,也就是说'5'与5是不同的。

③转义字符是一种特殊的字符型常量。转义字符以反斜线“\”开头,后面跟一个或几个字符。转义字符主要用来表示控制代码,例如,“回车”、“换行”等。转义字符具有特定的含义,不同于字符原有的意义,所以称为“转义”字符。常用转义字符如表2-2所示。

表2-2 常用的转义字符及其功能

表中最后两行是用ASCII码(八进制或十六进制)表示一个字符。例如,'\101'或'\x41'表示ASCII码为十进制数65的字符'A'。其中'\101'中101是八进制,转换成十进制是65,而'\x41'中x41是十六进制,转换成十进制也是65。

【例2.3】字符型常量的输出。

程序代码如下:

运行结果如图2-4所示。

图2-4 例2.3运行结果

(4)字符串常量

字符串常量是用一对双引号括起来的字符序列。例如,"hello"、""、"123"。字符串的长度等于字符串中包含的字符个数,例如,字符串"hello"的长度为5个字符。

字符串常量与字符型常量是不同的,它们之间主要的区别有:

①字符型常量使用单引号定界,字符串常量使用双引号来定界。

②字符型常量只能是单个字符,字符串常量则可以包含一个或多个字符。

③可以把一个字符型常量赋给一个字符型变量,但不能把一个字符串常量赋给一个字符串变量,在C语言中没有相应的字符串变量,可以用一个字符数组来存放一个字符串常量。

字符型常量占一个字节的存储空间,字符串常量占的内存字节数等于字符串的长度加1,增加的一个字节中存放字符'\0',用于标志字符串的结束。

字符型常量'a'和字符串常量"a",虽然都只有一个字符,但在内存中的存储情况是不同的。

'a'在内存中占一个字节,可表示为:

"a"在内存中占两个字节,可表示为:

(5)符号常量

在C语言中,也可以用一个标识符来表示一个常量,称为符号常量。符号常量在使用之前必须先定义,其一般形式如下:

#define标识符常量

【例2.4】已知商品的数量和单价,单价为常量,数量可变,求应付款。

程序代码如下:

运行结果如图2-5所示。

图2-5 例2.4运行结果

如例2.4中,商品单价用PRICE表示,可写为:#define PRICE 30

其中,define是关键字,前面加“#”,表示一条预处理命令(预处理命令都以“#”开头),称为宏定义命令。

该语句的功能是把标识符PRICE定义为其后的常量值30,定义后在程序中所有出现PRICE的地方均可以30来代替。符号常量的标识符是用户自己定义的。

符号常量的特点:

①习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。

②符号常量与变量不同,符号常量的值在其作用域内不能改变,也不能再被赋值。

③使用符号常量的好处是:含义清楚,并且能做到“一改全改”。

2.1.4 变量

在程序运行过程中,其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量定义必须放在变量使用之前,一般放在函数体的开头部分。要区分变量名和变量值两个概念。在例2.1中,圆半径r的值为1,则变量r在内存中的存储形式如下:

C语言规定,所有变量在使用前必须先定义。

回顾例2.1中的两行程序代码:int r;和float s,g;

这两行代码功能是定义了一个整型变量r和两个浮点型变量s,g。其中int和float都是数据类型标识符,是C语言的关键字,用来说明变量的类型,而r,s,g是变量名。

(1)变量定义的格式

变量定义的格式如下:

存储类型符 数据类型符 变量名表;

说明:

①存储类型符用来说明变量的存储类型,存储类型有自动类型(auto),寄存器类型(register),静态类型(static),外部类型(extern)等,默认为自动类型。如果未对存储类型做说明,则为自动类型。在例2.1中,变量定义语句都没有声明存储类型,所以都按自动类型处理。

②数据类型符用来说明变量的数据类型,它可以是C语言中任意一种基本数据类型。

③变量名表中可以只有一个变量名,也可以有多个变量名;如果有多个变量名,各变量名之间用逗号分开。

(2)变量的赋值

定义变量后,在使用之前需要给变量一个初始值。在C语言中,可以通过赋值运算“=”给变量赋值。

变量赋值的一般格式是:

变量名=表达式;

变量的赋值常用的有以下两种情况:

①先定义后赋值。如:

int r;

r=1;

②在定义变量的同时为其赋值,称为变量的初始化。定义的变量可以全部初始化,也可以部分初始化。

例如,int r=1;,该语句即定义了整型变量r,同时为其赋初值为1。

变量在某一时刻只有一个确定的值,变量获得新值后,其原始值被覆盖。例如:

int r;

r=1;

r=2;

该程序段执行后,变量r的值不是1,而是2。

定义多个同类型变量并要给所有变量赋值,只能逐个处理,每个赋值表达式之间用逗号分开。例如,有三个整型变量x,y,z,且初始值都是10,则可以写成如下形式:int x=10,y=10,z=10;

如果变量的类型与所赋数据的类型不一致,所赋数据将被转换成与变量相同的类型。例如,int x=10.5;,该程序执行后,变量x的值是整数10。