第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语言整型常数可用三种表示方式:
(1) 十进制整数。如124,234,-23,0等。
(2) 八进制整数。以0开头的数是八进制数。如0234表示八进制数(234)8,它等于十进制数156。
(3) 十六进制整数。以0x或0X开头的数是十六进制数。如0x234表示十六进制数(234)16,它等于十进制数564。
例2.1 整型常量的表示。
#include <stdio.h>
void main() {
int a, b, c;
a=50; // a为十进制整数50
b=-032; // b为八进制整数-32
c=0x5b; // c为十六进制整数5b
printf(a=%d, b=%d, c=%d\n, 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.0103。但注意字母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所示。
表2-1 转义字符 | |||
字符 | 功 能 | 字符 | 功 能 |
\n | 换行 | \a | 响铃 |
\t | 横向跳格(跳到下一个输出区) | \\ | 反斜杠字符 |
\v | 竖向跳格 | \ | 单引号字符 |
\b | 退格 | \ | 双引号字符 |
\r | 回车 | \ddd | 1到3位8进制数所代表的字符 |
\f | 走纸换页 | \xhh | 1到2位16进制数所代表的字符 |
例2.2 转义字符的验证。
#include <stdio.h>
void main() {
printf(□□c\t□de\ra\tY\b=\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
■
在显示屏上看到的结果是:
a□□□□□□□=de
■
这是由于转义字符\r使当前输出位置回到本行行首,自此输出的字符(包括空格和转义字符\t导致的跳格所经过的位置)将取代原来屏幕上显示的字符;转义字符\b导致退格,使当前输出位置左移一列,该位置上原来屏幕上已显示字符也将被新输出的字符所取代。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的已取代了旧的,所以误认为未输出应输出的字符。
而在打印机输出时,不像显示屏那样会“抹掉”原字符,人们可以从打印机的运动过程观察到所有的输出过程和结果。如在第9列上输出字符Y后又输出字符=,两字符重叠打印成“¥”。
2.字符串常量
字符串常量由一对双引号括起来的字符或转义字符序列构成。如welcome、a、$567.88、I am a student.\n、\n\n等都是字符串常量。
注意:a是字符常量,a是字符串常量,二者不同,不要混淆。
2.2.4 符号常量
符号常量是在程序(或程序的一部分)中指定用一个符号(标识符)代表一个常量。请看下面的例子:
例2.3 符号常量的使用。
#include <stdio.h>
#define PI 3.14159 /* 定义符号常量PI */
void main() {
float radius, area;
radius=2.0;
area=PI*radius*radius;
printf(Area=%f\n, 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) 一个变量在内存中占据一定大小的存储单元,可以通过变量名对该存储单元存取变量的值,如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等都是非法的变量名。
在编程时,变量、函数等标识符的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。标识符的命名方式,决定了程序书写的风格。在整个程序中要保持统一风格,这很重要。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论