admin 管理员组

文章数量: 1086019


2023年12月16日发(作者:旅游网站怎么制作)

第2章 数 据 类 型

我们知道计算机处理的对象就是数据,然而不是所有的数据计算机都能直接处理。在计算机高级语言中能直接处理的数据类型称为该语言的数据类型。本章主要讨论C语言的数据类型。

2.1 C数据类型概述

什么是计算机的数据类型?这是我们首先要明确的一个问题。

数据类型(data type)是一个值的集合和定义在这个集合上的一组操作的总称。例如C语言中的整数类型int,它的值的集合为区间[minint,maxint]上的整数(minint、maxint是依赖特定计算机的最小、最大整数);定义在其上的一组操作为:加、减、乘、整除和取模等。数据类型体现了数据结构的特点,一种高级语言提供的数据类型越丰富,其直接描述简单数据结构和组织复杂数据结构的能力就越强。

C语言提供的数据类型较一般高级语言丰富,C语言除提供整型、字符型和实型等基本数据类型外,还提供了数组、结构体、共用体和指针等数据类型。利用这些数据类型能便捷地描述较复杂的数据结构(如常用的链表、二叉树、栈等动态存储分配的数据结构)。

C的数据类型如下:

C语言中的数据有常量和变量之分,类似于数学中的常量和变量。

指针类型

空类型

数据类型

构造类型

基本类型

整型

字符型

实型(即浮点型)

枚举类型

数组类型

结构体类型

共用体类型

2.2 常 量

常量是指程序运行过程中其值不能被改变的数据对象。常量可以有不同的类型,如:78,0,96为整型常量;76.6,12.4为实型常量;a,A为字符型常量;a、C Language是字符串常量等。

2.2.1 整型常量

整型常量即整型常数。C语言整型常数可用三种表示方式:

• 12

(1) 十进制整数。如124,234,23,0等。

(2) 八进制整数。以0开头的数是八进制数。如0234表示八进制数(234)8,它等于十进制数156。

(3) 十六进制整数。以0x或0X开头的数是十六进制数。如0x234表示十六进制数(234)16,它等于十进制数564。

例2.1 整型常量的表示。

#include

void main() {

int a, b, c;

a50; // a为十进制整数50

b032; // b为八进制整数32

c0x5b; // c为十六进制整数5b

printf(ad, bd, cdn, a, b, c); //以十进制整数形式输出a,b,c的值

}

运行结果如下:

a50, b26, c91

2.2.2 实型常量

实数在C语言中又称浮点数。实数有两种表示形式:

(1) 十进制数形式。它由数字和小数点组成(注意必须有小数点)。如0.678,.678,678.0,678.,0.0都是十进制数形式。

(2) 指数形式。如54.0e3或54E3都代表54.0103。但注意字母e(或E)之前必须有数字,且e后面指数必须为整数,如e6,3.2e7.5,.e9,5e等都是不合法的指数形式。

2.2.3 字符型常量

1.字符常量

C语言的字符常量是用单引号(即撇号)括起来的一个字符。如a,A,#,?等都是字符常量。注意,a和A是不同的字符常量。

C语言中有些控制字符(又称非显示字符)是无法直接用字符常量形式表示的。例如,前面已经遇到过的,在printf函数中的n,它代表一个“换行”符,就是一个难以用字符常量表示的控制字符。C语言规定用一种特殊形式表示控制字符,即以一个“”开头的字符序列。因为“”后面的字符已不再是原来该字符的作用而转为新的含义,因而称为转义字符。如n中的“n”不代表字母n,而作为“换行”符。C语言的转义字符如表2-1所示。

字符

n

t

v

b

r

f

功 能

换行

横向跳格(跳到下一个输出区)

竖向跳格

退格

回车

走纸换页

表2-1 转义字符

字符

a

ddd

xhh

功 能

响铃

反斜杠字符

单引号字符

双引号字符

1到3位8进制数所代表的字符

1到2位16进制数所代表的字符

• 13

例2.2 转义字符的验证。

#include

void main() {

printf(□□ct□deratYb=n); //为了反映空格的个数,用□表示空格

printf(376);

}

第一个printf函数先在第一行左端开始输出“□□c”,然后遇到转义字符t,它的作用是跳格,即跳到下一个“输出区”,在我们所用系统中一个“输出区”占8列。“下一个输出区”从第9列开始,故在第911列上输出“□de”。下面遇到转义字符r,它代表“回车”

(不换行),当前输出位置移至本行行首(第1列),输出字符a,然后遇转义字符t再使当前输出位置移到第9列,输出字符Y,输出Y后当前输出位置是第10列。然后遇转义字符b,它的作用是“退格”,使当前输出位置回退到第9列,接着输出=。下面是转义字符n,它的作用是“回车换行”,当前输出位置移至下一行的行首。第二个printf函数是输出转义字符376,即字符■。

程序运行时,在打印机上得到如下结果(为了清晰地反映空格个数和对位关系,这里用□表示空格,并全部使用全角字符):

a□c□□□□□¥de

第9列

在显示屏上看到的结果是:

a□□□□□□□=de

第9列

这是由于转义字符r使当前输出位置回到本行行首,自此输出的字符(包括空格和转义字符t导致的跳格所经过的位置)将取代原来屏幕上显示的字符;转义字符b导致退格,使当前输出位置左移一列,该位置上原来屏幕上已显示字符也将被新输出的字符所取代。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的已取代了旧的,所以误认为未输出应输出的字符。而在打印机输出时,不像显示屏那样会“抹掉”原字符,人们可以从打印机的运动过程观察到所有的输出过程和结果。如在第9列上输出字符Y后又输出字符=,两字符重叠打印成“¥”。

2.字符串常量

字符串常量由一对双引号括起来的字符或转义字符序列构成。如welcome、a、$567.88、I am a student.n、nn等都是字符串常量。

注意:a是字符常量,a是字符串常量,二者不同,不要混淆。

2.2.4 符号常量

符号常量是在程序(或程序的一部分)中指定用一个符号(标识符)代表一个常量。请看下面的例子:

例2.3 符号常量的使用。

#include

#define PI 3.14159 /* 定义符号常量PI */

void main() {

• 14

float radius, area;

radius2.0;

areaPI*radius*radius;

printf(Areafn, area);

}

程序中用#define命令行定义标识符PI代表常量3.14159,此后凡在此文件中出现的PI都代表3.14159,可以和常量一样参与运算。程序运行结果为:

Area12.566360

说明:

(1) 我们用符号PI代替常量3.14159,使程序更易理解,可读性好。

(2) 当需要修改PI的值时只需要改一处即可,方便又不易出错。

(3) 定义符号常量要用#define命令,一般格式是:

#define 符号常量标识符 常量

这是一种“预编译命令”。有关#define命令的详细用法参见第12章。

注意:

符号常量不同于变量,它的值在其作用域(在本例为主函数)内不能改变,也不能再被赋值。如使用以下赋值语句给符号常量PI赋值是错误的。

PI3.1415; /* 错误的赋值语句 */

习惯上,符号常量名用大写,变量名用小写,以示区别。

2.3 变 量

变量是指在程序运行过程中其值可以被改变的数据对象。实质上,变量是程序中的数据连同其存储空间的抽象。

C语言规定变量必须先定义(也可称为声明)后使用。所谓定义变量就是通过C语句要求系统为该变量分配一个适当的存储单元,供存放数据使用。

例如,C语句“int x;”就是向系统申请一个能存放int(基本整数)型数据的存储单元,如图2-1(a)所示。

系统分配的这个单元只能存放int型的数据,且每一个时刻只能存放一个,x为这个单元的名字,我们称为变量名。

变量定义好后,我们可以通过变量名对该单元进行存取数据。如C语句“x25;”就是把25存入变量x中,其结果如图2-1(b)所示。如果再执行C语句“x128;”将把128存入变量x中,其结果如图2-1(c)所示,此时变量x的值就改变为128,而不再是25。

理解C语言的变量时应该注意以下几点:

(1) 一个变量应该有一个名字,称为变量名,如变量名x。

(2) 一个变量在内存中占据一定大小的存储单元,可以通过变量名对该存储单元存取变• 15

x

x

25

x

128

(a) (b) (c)

图2-1 变量的存储单元

量的值,如128为变量x的值。

(3) 变量是有类型的,不同类型的变量分配不同大小的存储空间,存放不同类型的数据。如C语句“int x;”定义的是一个int型变量,它所对应的存储单元是2个字节。

(4) 所谓的变量应该包括变量名、存储单元、变量的值几部分内容。

2.3.1 标识符的命名规则

与其他高级语言一样,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名等的有效字符序列称为标识符。简单地说,标识符就是一个名字。

C语言是大小写敏感的,即大写和小写字母认为是不同的字母。例如变量名name和NAME表示不同的名字。

C语言标识符的命名规则是:

(1) 标识符只能由26个字母、数字和下横线“_”组成,且数字不能作为标识符的第一个字符。

(2) C语言中标识符的长度(字符个数)无统一规定,随系统而定。在Turbo C中,一个标识符的前31个字符在程序中是有效的,也即是说,它们可以相互区别。

(3) 标识符中间不能有空格。

(4) C语言的关键字不能作为标识符。

例如,price、velocity、a3、interest、m_iNumber等都是合法的变量名,而101、NO.1、S&T、#203、red flag、up-to-date等都是非法的变量名。

在编程时,变量、函数等标识符的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。标识符的命名方式,决定了程序书写的风格。在整个程序中要保持统一风格,这很重要。

一般地,标识符的选择通常是“常用取简,专用取繁”,尽量“见名知义”,以增加程序的可读性。例如,看到numberOfStuddents这个变量名就知道它表示学生数,即便写成numOfStudent也是一目了然。另一方面,X6y5其含义就不是很清楚了。

习惯上,变量名用小写字母表示。如果名字需要由两个单词或两个以上的单词(如math和score)组成,常用的两种命名方式是math_score和mathScore。前一种形式称为连接命名法,它是通过下划线将多个单词连接起来;后一种形式称为骆驼表示法,因为大写字母看起来像驼峰。

还有一种特别流行的方法是匈牙利标记法(Hungarian notation),该法在每个变量名字前面加上若干表示类型的字符,如,fMathScore表示实型变量(f代表float型)、fpMathScore表示实型指针变量(fp代表float型的指针)。这种命名方法是以两条规则为基础的:

(1) 标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。表2-2中列出了常用的数据类型的前缀。

表2-2 常用数据类型的前缀

前缀

c

sz

s

n或i

字符(char)

表示以0结尾的字符串(string)

短整数(short)

整型(int)

常用数据类型 前缀

l

f

df

un

常用数据类型

长整型(long)

单精度实型(float)

双精度实型(double)

无符号整型(unsigned)

• 16

(2) 在标识符内,前缀以后就是一个或者多个第一字母大写的单词,这些单词清楚地指出了变量在源程序中的用途。例如,szStudentName表示学生姓名,数据类型是以0结尾的字符串。

2.3.2 变量的定义与初始化

C是强类型语言。强类型语言要求程序设计者在使用变量之前必须对变量进行定义(声明变量的数据类型)。程序设计过程中,绝大部分错误是发生在数据类型的误用上,使用强类型语言编程,编译程序能检查出尽可能多的数据类型方面的错误。

1.变量的定义

可以在一条语句中定义多个同类型的变量,变量定义的一般形式为:

类型标识符 变量列表;

表2-3中列出了C语言的基本数据类型标识符。

表2-3 C语言的基本数据类型标识符

标识符

int

short int或short

long int或long

unsigned int或unsigned

unsigned short int或unsigned short

unsigned long int或unsigned long

char或signed char

unsigned char

float

double

long double

void

基本整型

短整型

长整型

无符号整型

无符号短整型

无符号长整型

带符号字符型

无符号字符型

单精度实型(浮点型)

双精度实型

长双精度实型

空类型(或称无类型)

基本数据类型

例如:

unsigned unMyAge, unMyWage; // 定义2个unsigned int类型的变量

int iLength, iWidth, iHigh; // 定义3个int类型的变量

float fArea; // 定义1个float类型的变量

char cSex, cType; // 定义2个char类型的变量

说明:

(1) 空类型(void类型)仅仅是具有数据类型的形式,不具备其他数据类型的属性,它一般是用来声明函数的类型,表示函数不需要返回值。

(2) 字符串只有常量的概念,没有直接的变量概念。但是,可以通过字符数组和字符指针变量来实现字符串变量的作用(详见第6章和第8章)。

2.变量的初始化

定义一个变量后,系统为所定义的变量按数据类型的要求分配一个一定大小的存储单元,这时该存储单元所存放的值(变量的值)一般是一个不确定的值(随机值)。此后,可以用赋值运算符“”给变量赋值。

例如:

unsigned unMyAge; // 变量的定义

• 17

int iLength, iWidth;

unMyAge18; // 变量赋值

iLength12;

iWidth10;

也可以在定义变量的同时给变量赋值,称为变量的初始化。例如:

unsigned unMyAge18; // 变量的定义并初始化

int iLength12, iWidth10;

可见,一条变量初始化语句相当于前面介绍的变量定义、给变量赋值两条语句,它们的效果完全一样。系统都是先给变量分配一个存放整数的内存单元,然后将一个整数值赋给该变量(存储单元)。

3.变量或类型长度运算符sizeof( )

C语言提供的运算符sizeof( )是用来求C语言的类型或变量所分配存储单元的长度(字节数)。例如,sizeof(int)或sizeof(iWidth)的值为2,sizeof(float)或sizeof(fArea)的值为4,说明int型的数据在计算机内存占2个字节,而float型的数据占4个字节。

2.3.3 整型变量

基本数据类型的变量包括整型变量、实型变量、字符型变量和枚举类型变量(在第11章中讨论)。整型变量可分为基本型、短整型、长整型三种,分别是:

(1) 基本型,类型标识符为int;

(2) 短整型,类型标识符为short int或short;

(3) 长整型,类型标识符为long int或long。

它们又区分为有符号(signed)和无符号(unsigned)两大类。对于有符号数,存储单元的最高位用来存储符号,0表示,1表示;对于无符号数,存储单元中全部二进制位(bit)用作存放数本身,而不包括符号。无符号型变量只能存放不带符号的整数,如23、507等,而不能存放负数,如23、98。如果整型量在内存中占2个字节(16位),则int型变量存放数的范围为3276832767,而unsigned int型变量存放数的范围为065535。概括起来,整型变量有:

C标准没有具体规定以上各类数据所占内存字节数,各种机器处理上有所不同,一般以一个机器字(word)存放一个int型数据,而long型数据的字节数应不小于int型,short型不长于int型。

以IBM PC为例,整型数的表示范围如表2-4所示。用户可根据数的范围来选用。

• 18

基本整型(int)

短整型(short)

整型变量

长整型(long)

无符号整型(unsigned int)

无符号型

无符号短整型(unsigned short)

无符号长整型(unsigned long)

表2-4 整型数据的表示范围

类型标识符

int

short [int]

long [int]

unsigned [int]

unsigned short

unsigned long

所占位数

16

16

32

16

16

32

15数的范围

32 76832 767 即 2(2151)

32 76832 767 即 215(2151)

2 147 483 6482 147 483 647 即 231(2311)

065 535 即 0(2161)

065 535 即 0(2161)

04 294 967 295 即 0(2321)

例如:

int a2;

short int b32765;

long int c2;

unsigned int d65534;

unsigned short e32765;

unsigned long f0xABCDEF;

整型数据初始化后,系统分配给相应变量的存储单元及整型数据的存储结构如图2-2所示。注意:变量a、b、c的最高位(即最左边一位)为符号位。

图2-2 整数的存储

f

c

a

b

01 11 11 11 11 11 11 01

1111 11 11 11 11 11 10

int型(2)

short型(32765)

long型(2)

unsigned int型(65534)

unsigned short型(32765)

unsigned long型(0xABCDEF)

11 11 11 11 11 11 11 11

11 11 11 11 11 11 11 10

d

e

11 11 11 11 11 11 11 10

01 11 11 11 11 11 11 01

00 00 00 00 10 10 10 11 11 00 11 01 11 10 11 11

2.3.4 实型变量

C语言的实型变量分为单精度型(float型)、双精度型(double型)和长双精度型(long double型)三类。对每一个实型变量都应在使用前加以定义。如:

float x, y; // 定义x、y为单精度实型变量

double z; // 定义z为双精度实型变量

实数的有效数字位数和数值的范围随机器系统而异。在IBM PC中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节(64位),一个long double型数据占10个字节(80位)。单精度实数提供67位有效数字,双精度实数提供1516位有效数字,长双精度实数提供1819位有效数字;单精度实数的数值范围约为3.410383.41038,双精度实数范围约为1.7103081.710308,长双精度实数范围为3.41049321.1104932。

应当说明,实型常量不分float型和double型。一个实型常量可以赋给一个float型或double型变量,根据变量的类型截取实型常量中相应的有效位数字。例如:

float a;

• 19

a222222.222;

由于float型变量a只能接收7位有效数字(即a222222.2),因此最后两位小数不起作用。如果a改为double型,则能全部接收上述9位数字并存储在变量a中。

2.3.5 字符型变量

1.字符型变量

字符型变量(简称为字符变量)可以存放单个字符型数据。例如:

char cl, c2;

表示cl和c2为字符型变量,各可以存放一个字符。我们可以用下面的语句给它们赋值:

cl=a;

c2=b;

注意:

(1) 系统分配一个字节大小的单元给字符型变量。

(2) 对于字符型变量,存储单元中存放的是字符的ASCII码。如c1、c2的存储形式如图2-3所示。

c1

0 1 1 0 0 0 0 1

c2

0 1 1 0 0 0 1 0

图2-3 字符数据的存储形式

(3) 由于在内存中,字符型数据是以ASCII码形式存储的,它的存储形式与整数的存储形式相类似,所以C语言的字符型数据和整型数据可以通用。因此,C语言中的字符数据和整型数据可以相互赋值;并且字符数据可以以字符形式输出,也可以以整数形式输出。

例2.4 字符型数据的整型处理。

#include

void main() {

char c1, c2, c3;

c1a;

c297;

c3c132;

printf(c, c, c, c1, c2, c3);

printf(d, d, d, c1, c2, c3);

}

运行结果如下:

a, a, A

97, 97, 65

分析:其中c1、c2、c3被定义为字符型变量,然后给c1、c2分别赋予字符常量a、整数97,而C语言对于a,和97在内存中的存储形式是完全一样的;c3赋予一个算术表达式c132(其值为65,对应字符为A)。

上述程序中从a到A的变换是c3c132。C语言对字符数据作这种处理使程序设计增大了自由度,因而对字符作各种转换就比较方便。

• 20

提醒读者注意,将一个整数赋给一个字符型变量时,该整数应在0255范围内,否则会产生溢出。

(4) 无符号字符型标识符unsigned char的使用。在Turbo C系统中,将字符型变量所占用的字节的最高位当成符号位,或者说把字符处理成带符号的整数。如:

字符a:01100001

它的最高位(8位中最左一位)为0,此字符按整数形式输出时就输出一个正整数,它的值就是ASCII码的值97。

字符376:11111110

它的最高位为1,内存中被视为负数,如按字符形式输出则是系统中相应的图形字符,在IBM

PC上为字符■;如将它按整型输出,输出结果是2,因为2的补码为11111110。

如果字符型变量说明为unsigned char型数据,即无符号字符型变量,其最高位不作为符号位。

例2.5 无符号字符数据。

#include

void main() {

unsigned char c376;

printf(c, d, c, c);

}

运行结果如下:

■, 254

这是由于11111110的十进制数值为254。

2.字符数据与字符串数据的区别

字符数据与字符串数据不仅仅是书写形式和字符的个数不同,它们在内存中的存储形式也是有较大区别的。

在C语言中,每一个字符串的结尾系统自动加上一个字符串结束标志0,以便系统据此判断字符串是否结束。0是一个ASCII码为0的字符,是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。

我们可通过比较a、a、HELLO在内存中存储形式的不同(如图2-4所示),了解字符常量与字符串常量的区别。其中,字符a占1个字节的存储空间,字符串a占2个字节的存储空间,字符串HELLO占6个字节的存储空间。

例如:

char c1, c2, c3;

c1a;

• 21

HELLO

01001000

H

a

01100001

01000101

E

01001100

L

01001100

L

a

01100001

a

00000000

0

01001111

O

00000000

0

图2-4 字符与字符串的存储比较

c2a; // 错误的赋值语句

c3HELLO; // 错误的赋值语句

一个字符串不能赋给一个字符型变量。

说明:

(1) 字符串在输出时并不输出0。例如:

printf(S, HELLO);

将逐个字符输出HELLO,直到遇到最后的结束符0,就知道字符串结束,停止输出。

(2) 在写字符串时不必加0。讲到这里,有人要问,C语言中如何定义字符串变量呢?在C语言中,并没有直接的字符串变量的概念,但是可以通过字符数组和字符指针变量来实现字符串变量的作用(详见第6章和第8章)。

2.3.6 限定词const

如果想让变量的内容自初始化后一直保持不变,则可以使用变量的限定词const。例如:

float x345.67;

const float pi3.1415926;

虽然系统给变量x、pi都分配了4个字节,但是变量x的值是可以变化的(通过重新赋值),而变量pi受到const的限定,这意味着不能重新给pi赋值,它相当于一个float型的常量3.1415,即变量pi的作用实际上相当于常量。如:

x890.12; // ok

pi3.1415; // error

说明:由#define命令定义的常量标识符(符号常量)是没有类型属性的,也不会分配存储单元;而const声明的变量是有数据类型属性的,需要分配存储单元,只是该存储单元的值除了定义时初始化外,再不允许重新赋值。例如:

#define PI 3.141592653

const float pi3.141592653;

由于float型的数据只接受7位数据,所以pi的值是3.141593(最后1位有效数字是由四舍五入得到);如果把pi的类型改为double,则10位有效数值可全部接收。对于PI,在编译前(预编译过程中)就把程序中出现的所有PI全部用3.141592653替代完成,因此,它是没有数据类型属性的。

习 题

2.1 设C语言中,int型数据占2个字节,则long型数据占____个字节;unsigned int型数据占____个字节;short型数据占____个字节,double型数据占____字节;char型数据占__

_____字节。

2.2 若a为整型变量,以下语句( )。

a2L;

printf(dn, a);

A) 赋值不合法 B) 输出值为2 C) 输出为不确定值 D) 输出值为2

2.3 若int型数据占2个字节,则以下语句的输出为( )。

• 22

int k1;

printf(d, un, k, k);

A) 1, 1 B) 1, 32767 C) 1, 32768 D) 1, 65535

2.4 请选出正确的数值和字符常量,并说明类型;对于不正确的数,说明原因。

(1) 0.0 (2) 5L

(3) 013 (4) 0xff (5) 0xaa

(6) 018

(7) 9861 (8) 011 (9) 3.987E2 (10) .987

(11) 0xabcd

(12) 50.

(13) 8.9e1.2

(14) 1e1

(15) 0xFF00

(16) 0.825e2

(17) 473 (18) Ox4

(19) c

(21)  (22) 0

(23) 0 (24) A

2.5 请从下面的字符中选出正确的C语言的转义符。

(1)  (2) 1011 (3) 

(5) t (6) 156 (7) n

2.6 写出下列程序的运行结果。

#include

void main() {

char c1a, c2b, c3c, c4101, c5116;

printf(abctdebhrAtgn);

printf(acbctcctabcn, c1, c2, c3);

printf(tbcc, c4, c5);

}

(20) t

018

(8) xaa

• 23

(4)


本文标签: 变量 字符 常量 输出 数据