您好,欢迎访问三七文档
•12•第2章数据类型我们知道计算机处理的对象就是数据,然而不是所有的数据计算机都能直接处理。在计算机高级语言中能直接处理的数据类型称为该语言的数据类型。本章主要讨论C语言的数据类型。2.1C数据类型概述什么是计算机的数据类型?这是我们首先要明确的一个问题。数据类型(datatype)是一个值的集合和定义在这个集合上的一组操作的总称。例如C语言中的整数类型int,它的值的集合为区间[minint,maxint]上的整数(minint、maxint是依赖特定计算机的最小、最大整数);定义在其上的一组操作为:加、减、乘、整除和取模等。数据类型体现了数据结构的特点,一种高级语言提供的数据类型越丰富,其直接描述简单数据结构和组织复杂数据结构的能力就越强。C语言提供的数据类型较一般高级语言丰富,C语言除提供整型、字符型和实型等基本数据类型外,还提供了数组、结构体、共用体和指针等数据类型。利用这些数据类型能便捷地描述较复杂的数据结构(如常用的链表、二叉树、栈等动态存储分配的数据结构)。C的数据类型如下:C语言中的数据有常量和变量之分,类似于数学中的常量和变量。2.2常量常量是指程序运行过程中其值不能被改变的数据对象。常量可以有不同的类型,如:78,0,96为整型常量;76.6,12.4为实型常量;a,A为字符型常量;a、CLanguage是字符串常量等。2.2.1整型常量整型常量即整型常数。C语言整型常数可用三种表示方式:数据类型空类型指针类型基本类型整型字符型实型(即浮点型)枚举类型构造类型数组类型结构体类型共用体类型•13•(1)十进制整数。如124,234,23,0等。(2)八进制整数。以0开头的数是八进制数。如0234表示八进制数(234)8,它等于十进制数156。(3)十六进制整数。以0x或0X开头的数是十六进制数。如0x234表示十六进制数(234)16,它等于十进制数564。例2.1整型常量的表示。#includestdio.hvoidmain(){inta,b,c;a50;//a为十进制整数50b032;//b为八进制整数32c0x5b;//c为十六进制整数5bprintf(ad,bd,cd\n,a,b,c);//以十进制整数形式输出a,b,c的值}运行结果如下:a50,b26,c912.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回车\ddd1到3位8进制数所代表的字符\f走纸换页\xhh1到2位16进制数所代表的字符•14•例2.2转义字符的验证。#includestdio.hvoidmain(){printf(□□c\t□de\ra\tY\b=\n);//为了反映空格的个数,用□表示空格printf(\376);}第一个printf函数先在第一行左端开始输出“□□c”,然后遇到转义字符\t,它的作用是跳格,即跳到下一个“输出区”,在我们所用系统中一个“输出区”占8列。“下一个输出区”从第9列开始,故在第911列上输出“□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、Iamastudent.\n、\n\n等都是字符串常量。注意:a是字符常量,a是字符串常量,二者不同,不要混淆。2.2.4符号常量符号常量是在程序(或程序的一部分)中指定用一个符号(标识符)代表一个常量。请看下面的例子:例2.3符号常量的使用。#includestdio.h#definePI3.14159/*定义符号常量PI*/voidmain(){第9列第9列•15•floatradius,area;radius2.0;areaPI*radius*radius;printf(Areaf\n,area);}程序中用#define命令行定义标识符PI代表常量3.14159,此后凡在此文件中出现的PI都代表3.14159,可以和常量一样参与运算。程序运行结果为:Area12.566360说明:(1)我们用符号PI代替常量3.14159,使程序更易理解,可读性好。(2)当需要修改PI的值时只需要改一处即可,方便又不易出错。(3)定义符号常量要用#define命令,一般格式是:#define符号常量标识符常量这是一种“预编译命令”。有关#define命令的详细用法参见第12章。注意:符号常量不同于变量,它的值在其作用域(在本例为主函数)内不能改变,也不能再被赋值。如使用以下赋值语句给符号常量PI赋值是错误的。PI3.1415;/*错误的赋值语句*/习惯上,符号常量名用大写,变量名用小写,以示区别。2.3变量变量是指在程序运行过程中其值可以被改变的数据对象。实质上,变量是程序中的数据连同其存储空间的抽象。C语言规定变量必须先定义(也可称为声明)后使用。所谓定义变量就是通过C语句要求系统为该变量分配一个适当的存储单元,供存放数据使用。例如,C语句“intx;”就是向系统申请一个能存放int(基本整数)型数据的存储单元,如图2-1(a)所示。系统分配的这个单元只能存放int型的数据,且每一个时刻只能存放一个,x为这个单元的名字,我们称为变量名。变量定义好后,我们可以通过变量名对该单元进行存取数据。如C语句“x25;”就是把25存入变量x中,其结果如图2-1(b)所示。如果再执行C语句“x128;”将把128存入变量x中,其结果如图2-1(c)所示,此时变量x的值就改变为128,而不再是25。理解C语言的变量时应该注意以下几点:(1)一个变量应该有一个名字,称为变量名,如变量名x。(2)一个变量在内存中占据一定大小的存储单元,可以通过变量名对该存储单元存取变xxx(a)(b)(c)图2-1变量的存储单元25128•16•量的值,如128为变量x的值。(3)变量是有类型的,不同类型的变量分配不同大小的存储空间,存放不同类型的数据。如C语句“intx;”定义的是一个int型变量,它所对应的存储单元是2个字节。(4)所谓的变量应该包括变量名、存储单元、变量的值几部分内容。2.3.1标识符的命名规则与其他高级语言一样,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名等的有效字符序列称为标识符。简单地说,标识符就是一个名字。C语言是大小写敏感的,即大写和小写字母认为是不同的字母。例如变量名name和NAME表示不同的名字。C语言标识符的命名规则是:(1)标识符只能由26个字母、数字和下横线“_”组成,且数字不能作为标识符的第一个字符。(2)C语言中标识符的长度(字符个数)无统一规定,随系统而定。在TurboC中,一个标识符的前31个字符在程序中是有效的,也即是说,它们可以相互区别。(3)标识符中间不能有空格。(4)C语言的关键字不能作为标识符。例如,price、velocity、a3、interest、m_iNumber等都是合法的变量名,而101、NO.1、S&T、#203、redflag、up-to-date等都是非法的变量名。在编程时,变量、函数等标识符的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。标识符的命名方式,决定了程序书写的风格。在整个程序中要保持统一风格,这很重要。一般地,标识符的选择通常是“常用取简,专用取繁”,尽量“见名知义”,以增加程序的可读性。例如,看到numberOfStuddents这个变量名就知道它表示学生数,即便写成numOfStudent也是一目了然。另一方面,X6y5其含义就不是很清楚了。习惯上,变量名用小写字母表示。如果名字需要由两个单词或两个以上的单词(如math和score)组成,常用的两种命名方式是math_score和mathScore。前一种形式称为连接命名法,它是通过下划线将多个单词连接起来;后一种形式称为骆驼表示法,因为大写字母看起来像驼峰。还有一种特别流行的方法是匈牙利标记法(Hungariannotation),该法在每个变量名字前面加上若干表示类型的字符,如,fMathScore表示实型变量(f代表float型)、fpMathScore表示实型指针变量(fp代表float型的指针)。这种命名方法是以两条规则为基础的:(1)标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。表2-2中列出了常用的数据类型的前缀。表2-2常用数据类型的前缀前缀常用数据类型前缀常用数据类型c字符(char)l长整型(long)sz表示以\0结尾的字符串(string)f单精度实型(float)s短整数(short)df双精度实型(double)n或i整型(int)un无符号整型(unsigned)•17•(2)在标识符内,前缀以后就是一个或者多个第一字母大写的单词,这些单词清楚地指出了变量在源程序中的用途。例如,szStudentName表示学生姓名,数据类型是以\0结尾的字符串。2.3.2变量的定义与初始化C是强类型语言。强类型语言要求程序设计者在使用变量之前必须对变量进行定义(声明变量的数据类型)。程序设计过程中,绝大部分错误是发生在数据类型的误用上,使用强类型语言编程,编译程序能检查出尽可能多的数据类型方面的错误。1.变量的定义可以在一条语
本文标题:第2章数据类型
链接地址:https://www.777doc.com/doc-2247138 .html