1、第二章 程序设计基础2.1 常量、变量和标识符常量、变量和标识符,包括后面将要讲到的运算符是C语言程序中最小的组成单位,用C语言编写的程序无论多么复杂或多么简单,都离不开这些基本要素。2.1.1 标识符【学习提示】理解标识符是否合法的判断简单地说,标识符就是一个名称,用来表示变量、常量、函数以及文件等名称。例如,我们每个人的姓名,就是每个人所对应的标识符。合法的标识符由字母(大、小写均可)、数字和下画线组成,并且必须以字母或下画线开头。C语言是一种对大小写敏感的语言,所以abc、aBc 和Abc 是3种不同的标识符。【例如】_sun、Mouse、student23、Football、FOOTB
2、ALL 都是合法的标识符。23student、Foot-ball、 和b&c 都是非法的标识符。【请思考】为什么说以上标识符是非法的标识符?标识符能否用汉字表示?本节重点:合法的用户标识符考查:合法的要求是由字母,数字,下划线组成。有其它元素就错了。并且第一个必须为字母或是下划线。第一个为数字就错了。关键字不可以作为用户标识符号。main、define、scanf、printf 都是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。2.1.2 关键字【学习提示】熟记C语言中的常用关键字所谓关键字是指被C语言保留的,不能用作其他用途的一些标识符,它们在程
3、序中都代表着固定的含义。例如,用来说明变量类型的标识符int、float 以及条件语句中的if、else 等都已经有专门的用途,它们不能再用作变量或函数名。2.1.3 常量什么是常量呢?简单地说,在程序运行过程中,其值不能被改变的量称为常量。常量可以分为3类,即整型常量、实型常量和字符型常量,其中整型常量和实型常量又称为数值型常量。整型常量:用不带小数点的数字表示。实型常量:用带小数点的数字表示。字符型常量:用带有单引号的字符表示。一般情况下,常量的类型可以通过书写形式来判断。【例如】1、2、12 是整型常量,2.1、12.5、3.14 是实型常量,a、 b、c是字符型常量。2.1.4 符号常
4、量【掌握】符号常量的定义和使用在C语言中,可以用一个标识符表示一个常量,称之为符号常量。符号常量是一种特殊的常量,其值和类型是通过符号常量的定义命令决定的。由于其较难理解,且是C语言中的重点,故单独讲解它的相关知识。符号常量在使用之前必须先定义,其一般形式为:#define 标识符 常量【说明】#define 是一条预处理命令,又被称为宏定义命令,其功能是把命令格式中的标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均以该常量值代之。习惯上符号常量的标识符用大写字母表示,变量标识符用小写字母表示,以示区别。用define 进行定义时,必须用“#”号作为一行的开头,在#de
5、fine 命令行的最后不得加分号结束。有关#define 命令的作用,将在第10 章中进行更深入的讲解,读者可以先按上述说明简单使用。【例2-1】求边长为20 的正方形的面积。程序代码#define LENGTH 20#includevoid main()float s;s=LENGTH*LENGTH;printf(s=%fn,s);在主函数中,s被定义为float 型,即实型;在主函数之前由宏定义命令定义LENGTH 为20,程序执行过程中即以LENGTH代替20,即s= LENGTH*LENGTH 等效于s=20*20。在程序中,不能再用赋值语句对符号常量重新赋值,也就是说,在本例中不能再
6、对LENGTH 赋值。【请注意】 在使用符号常量时,一般要做到“ 见名知意”,如上面的程序中LENGTH 就是正方形的边长。 使用符号常量的一个最大的好处就是能够做到“ 一改全改”,例如,想知道另一个边长为10的正方形的面积,那么就可以只做如下改变:#define LENGTH 10这样就能够轻松达到目的。读者可以掌握这种程序设计的技巧,这种“ 一改全改”的属性对编写比较大的程序是非常有利的。2.1.5 变量【学习提示】熟记变量的定义与初始化什么是变量呢?简单地说,在程序执行过程中,其值可以被改变的量称为变量。例如,二元一次方程y=12x+16 中,x称为自变量,y称为因变量,也就是说y会随着
7、x的变化而变化,所以,方程中的x和y都是变量。一个变量具有两个要素:变量名和变量值。每个变量都必须有一个名称,即变量名,变量的命名遵循标识符的命名规则。一个变量名实质上是代表了内存中的一个存储单元,该单元中存储的内容就是变量值。在程序执行的过程中,通过变量名来引用变量的值。当使用C语言的各种变量时,都必须遵循一个原则,即“先说明,后使用”。这里的“说明”是指在使用变量前要明确变量的数据类型、存储类型和作用域,即变量的定义。存储类型和作用域属于较难的知识点,将在第8章介绍。1变量的定义一条变量定义语句由数据类型和其后的一个或多个变量名组成,其定义形式如下:数据类型 变量名1,变量名2,;【说明】
8、我们把“变量名1, 变量名2,” 称之为变量名表。变量名表可以是一个或多个标识符,也就是说我们可以同时定义相同数据类型的多个变量。上述格式中的“”表示其中的内容是可选项,即可有可无,如果没有特殊说明,本书中出现的“”都表示这个含义。数据类型与变量名之间至少用一个空格隔开。当定义多个变量时,每两个标识符名之间用“,”隔开。【例如】int name, age;数据类型 变量名1 变量名2习惯上,为了增加程序的可读性,变量名和函数名中的英文字母用小写。对应的标识符,还应该做到“见名知意”。例如,name(姓名)、age(年龄)、student(学生)和teacher(老师)等。【请思考】在C语言中,
9、变量名total与变量名TOTAL、ToTaL、tOtAl等是同一个变量吗?2.变量的初始化在定义变量之后,可以根据需要赋予它一个初始值,即变量的初始化。在定义变量的同时,也可以对变量进行初始化,它的一般形式如下:数据类型 变量名1=初值, 变量名2=初值2;float price=2.5 ,数据类型 赋初值的变量名1 (price)length,area ;未赋初值的变量名(length)2和变量名3(area)2.2 数据类型在第1章曾经介绍过:算法处理的对象是数据,而数据是以某种特定的形式存在的(如整数、实数、字符等形式)。在讲解变量的定义及其初始化时,又多次提到过“数据类型”,那么,什
10、么是数据类型呢?简单地说,数据类型就是程序给其使用的数据指定的某种数据组织形式,从字面上理解,就是对数据按类型进行分类。例如,可以把人分为男性和女性,那么性别就是一种数据类型。数据类型是按被说明数据的性质、表示形式、占据存储空间的多少、构造特点来划分的。在语言中,数据类型可分为基本类型、构造类型、指针类型和空类型四大类,基本类型和构造类型又可以再分,如图2-1所示。下面将重点介绍整型、实型和字符型3种基本数据类型。由于指针类型和构造类型使用较少,而且比较难于理解,所以将这两部分内容安排在第9章和第11章中进行介绍。2.3 整型数据在实际考试中,有时会遇到这样的问题:求一些整数的某种运算结果,如
11、计算 1100 所有奇数的和。用C语言来实现的话,就要用到整型数据。整型数据包括整型变量和整型常量。2.3.1 整型变量1.整型变量的分类整型变量的基本类型说明符为int。由于不同的编译系统或计算机系统对整型变量所占用的字节数有不同的规定,因此根据在VC 6.0中各整型变量占用内存字节数的不同,可以将整型变量分为以下3类。基本整型:用int表示,在内存中占4个字节。短整型:用short int或short表示,在内存中占2个字节。长整型:用long int或long表示,在内存中占4个字节。为了增加变量的取值范围,还可以将变量定义为“无符号”型。以上3类都可以加上修饰符unsigned,以指定
12、是“无符号数”。如果加上修饰符signed,则被指定为“有符号数”。如果既不指定unsigned,也不指定signed,则系统默认为有符号数(signed)。各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故其不能表示负数。2.整型变量占用内存字节数与值域上述各类型整型变量占用的内存字节数因系统而异。在VC 6.0中,一般用4个字节表示一个int型(基本整型)变量,用2个字节表示一个short型(短整型)变量,用4个字节表示一个long型(长整型)变量。表2-1列出了各类整型变量所分配的内存字节数及可以表示的数的取值范围。方括号内的部分是可以不输入的。例如,s
13、igned int等价于int,所以,一般情况下signed都不输入。3.整型变量的定义整型变量定义的一般形式为:类型说明符 变量名1,变量名2;【说明】允许在一个类型说明符后说明多个相同类型的变量。类型说明符与变量名之间至少用一个空格隔开。当定义多个变量时,两个变量名之间用逗号“,”隔开。最后一个变量名之后必须以分号“;”结尾。变量说明必须放在变量使用之前,必须遵循“先说明,后使用”的原则,一般放在函数体的开头部分。【例如】int a,b,c; /*a,b,c为整型变量*/long d,e; /*d,e为长整型变量*/unsigned f,g; /*f,g为无符号整型变量*/2.3.2 整型
14、常量【熟记】整型常量的表示方法整型常量即整常数。按不同的进制,整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。 十进制数表示法十进制整型常量没有前缀,其数码为09。【例如】237、-568、65 535和1627都是合法的十进制整常量。 八进制数表示法八进制整型常量以0作为前缀,其数码为07。【例如】014(十进制为12)和0102(十进制为66)都是合法的八进制整型常量。014表示八进制数14,即(14)8,其值为181+480 ,即等于十进制数12。 十六进制数表示法十六进制整型常量以0X或0x作为前缀,其数码为09和AF(或af)。【例如】0X2A(十进制
15、为42)、0XA0(十进制为160)和0XFFFF(十进制为65 535)都是合法的十六进制整型常量。0X2A表示十六进制数2A,转换为十进制则是:程序中是根据前缀来区分各种进制数的,因此在书写常量时不要把前缀弄错,否则会出现不正确的结果。在C程序中,只有十进制数可以是负数,而八进制和十六进制数只能是无符号数。整型常量分为短整型(short int)、基本整型(int)、长整型(long int)和无符号型(unsigned)等不同类型。【请注意】整型常量的无符号数也可用后缀U或u来表示。例如,358u、0x38Au、235Lu(L表示long型)均为无符号数。前缀、后缀可同时使用,以表示各种
16、类型的数。例如,0XA5Lu表示十六进制无符号长整数A5,其十进制为165。本节重点:1.一定要记住 二进制 如何划成 十进制。2.八进制以0作为前缀,数码为07.3.十六进制以0X或0x作为前缀,数码为09和AF(af)2.4 实型数据当进行数据运算需要用到小数或指数时,用C语言来实现的话,就需要用到实型数据。2.4.1 实型变量1实型变量的分类【学习提示】熟记实型变量的分类及其取值范围C语言中的实型变量分为单精度(float)、双精度(double)和长双精度(long double)3种类型。在VC 6.0 中实型变量所占字节数、有效位数及其取值范围如表2-2所示。2实型变量的定义实型变
17、量定义的一般形式为:类型说明符 变量名1,变量名2,;float x,y; /*x,y 为单精度实型变量*/double a,b,c; /*a,b,c 为双精度实型变量*/3实型变量的舍入处理由于实型变量也是用有限的存储单元存储的,所以能够接受的有效数字的位数也是有限的。有效位数以外的位数将被舍去。请看下面的例子。【例2-2】实型变量的舍入处理。程序代码#includevoid main()float fa; /*定义了单精度浮点型变量fa*/double db; /*定义了双精度浮点型变量db*/fa=11111.111111; /*分别对两个浮点型变量赋初值*/db=11111.11111
18、1111111111111;printf(fa=%fndb=%f,fa,db); /*输出两个浮点型变量*/此程序的输出结果为:fa=11111.111328db=11111.111111对本实例的结果分析如下。(1)fa是单精度浮点型的变量,有效位数(有效位数是指整数部分和小数部分的总位数)只有7位。而整数部分已占5位,故小数点后2位之后的数均为无效数字。(2)db是双精度浮点型的变量,有效位数为16位。但VC 6.0规定小数后最多保留6位,其余部分舍去。2.4.2 实型常量1实型常量的表示【学习提示】熟记实型常量的表示方法实型常量即不包括整数的实数,在语言中又称浮点数。浮点数均为有符号浮点
19、数,没有无符号浮点数。其值有两种表达形式,分别为十进制小数形式和指数形式。(1)十进制小数形式由数字和小数组成,必须有小数点,且小数点的位置不受限制。3.1425、0.123、300.和.123都是合法的小数。(2)指数形式由十进制数加阶码标志e”或E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:尾数E(e)整型指数【说明】“尾数”是一个小数形式的实型常量;E或e是指数形式的标识,又称阶码标识;“整型指数”说明了指数的大小,又称阶码, 而且必须是整数。【例如】6.0E6或者6.0e6是合法的实型数据,表示6.0106。123(无小数点)、E79(阶码标志E之前无数字)、5(无阶码标识
20、)和2.7E(无阶码)是不合法的实型数据。一个实数可以有多种指数表示形式,如11.34可以表示为11.34e0、1.134e1、0.1134e2和0.1134e02等。我们把其中的1.134e1称为“规范化的指数形式”,即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。语言允许浮点数使用后缀。后缀为f”或F”即表示该数为浮点数,如123f和123.是等价的。2实型常量的类型实型常量又分float(单精度)型和double(双精度)型。一个实型常量可以赋给一个实型变量(float型或double型)。【例如】float a; /*这里定义a为单精度实型变量*/a=
21、5555.5555;由于float型变量只能接受7位有效数字,因此最后一位小数不起作用。【请思考】怎样变化才能使上面的8位数字都能够存储在变量a中?本节重点:实型数据的合法形式:例如:2.333e-1 就是合法的,且数据是2.33310-1。考试口诀:e前e后必有数,e后必为整数。2.5 字符型数据前面讲解的整型和实型与数学计算密切相关。语言还提供了字符型数据来处理文本信息,例如,对一篇英文文章中的单词按字母的某一顺序进行排序;将某一文件中所有字符的ASCII码值加上10等。字符型数据就是用来表示英文字母、符号和汉字的数据。2.5.1 字符变量字符变量的类型说明符是char,其定义的一般形式如
22、下:char 变量名1, 变量名2, ;【例如】char c1,c2;c1=a;c2=b;这样就定义了两个字符型的变量c1和c2,并分别赋值为字符型常量a和b。【说明】字符值是以ASCII码值的形式存放在变量的内存单元之中的。例如,a的十进制ASCII码值是97,b的十进制ASCII码值是98。对字符变量c1赋予a值,即“c1=a;”,实际上是在相应的存储单元中存放97的二进制代码:c1 00100001在VC 6.0中,字符型数据占1字节,因此字符型变量的值实质上是一个8位的整数值,取值范围一般是128127。char型变量也可以加修饰符unsigned,unsigned char型变量的取
23、值范围是0255。2.5.2 字符常量【学习提示】理解转义字符的形式及功能什么是字符常量呢?从表现形式上来说,就是用一对单引号括起来的单个字符。【例如】a,b,#,+都是合法的字符常量。【说明】在使用字符常量的时候应该注意,字符常量只能用单引号括起来,不能用双引号或其他符号。字符可以是字符集中任意字符,也就是说数字加上单引号就成为字符了。例如,1和1是不同的,1是字符常量,1是数值常量。对于字符型数据,除了可以直接用单引号来表示以外,如a、0、A,也可以用该字符的ASCII码值表示,例如,十进制数65表示大写字母A。除了以上形式的字符常量外,C语言还允许使用一种以特殊形式出现的字符常量,以表示
24、某些非图形字符, 这就是以“”开头的转义字符序列。在前面章节中,曾使用“n”来表示换行。“n”实际上是一个字符,它的ASCII码值为10。常见的以“”开头的转义字符如表2-3所示。程序代码#includevoid main()int a,b,c;/*定义了3个变量*/a=0;b=1;c=2;/*分别对单个整型变量赋初值*/printf(%dnt%d-%dn%d-%dtb%dn,a,b,c,a,b,c);/*输出3个整型变量的值*/根据“printf(%dnt%d%dn%d%dtb%dn,a,b,c,a,b,c);”语句,并结合表2-3,一起来分析程序的输出结果。程序在第1列输出a值0之后遇到转
25、义字符“n”,回车换行。遇到转义字符“t”,于是跳到下一制表位置,再输出b值1。输出一个字符“”,紧接着再输出c值2。又遇到转义字符“n”,因此再回车换行。输出两个“” 字符之后又输出a值0。再输出字符“”,又输出b值1。再次遇到转义字符“t”,跳到下一制表位置,但下一转义字符“b”又使退回一格,最后输出c值2。程序的输出结果如下:【请注意】字符变量的取值是字符常量,也就是说字符变量用于存放一个字符常量(切记,不要以为在一个字符型变量中可以存放一个字符串,即包括若干个字符)。2.5.3 字符型数据的运算【理解】字符型数据的运算原理C语言把字符型数据当作一个较小的整型数据,可以像使用整型量一样使
26、用它,下面来看一个例子。【例2-4】对字符变量的运算。程序代码#includevoid main()char c1=a; /*定义一个字符变量c1,并且初始化为字符常量a*/char c2; /*定义一个字符变量c2*/c2=c1-(a-A);printf(%cn,c2); /*输出字符变量c2*/分析程序可知,程序中的“a-A”是大小写字母之间的差值,参加运算的是两个字符所对应的ASCII 码值“97”和“65”,故运算结果为32。也可以把语句写成“c2=c132;”,其效果是一样的。最终程序的运行结果是输出字符“A”。C语言允许对整型变量赋予字符值,也允许对字符变量赋予整型值。在输出时,可
27、以将字符变量按整型量输出,也可以将整型量按字符量输出。【例如】printf(%d,A);程序运行结果为65,即输出的是字符“A”的ASCII 码值。2.5.4 字符串常量C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是用一对双引号()括起来的零个或多个字符的序列。【例如】CHINA 和 0123456789 都是字符串常量。在存储字符串常量时,由系统在字符串的末尾自动加一个“0”作为字符串的结束标志。如果有一个字符串为“CHINA”,则它在内存中的实际存储如图2-2所示。最后一个字符“0”是系统自动加上的,即字符串 “CHINA”占用了6个字节的内存空间。有很多人不能理解a和a
28、 的区别,那是因为他们不能正确理解字符常量和字符串常量的区别。下面就从表示方法、内存中的存储方式等方面来对二者进行比较。字符常量使用单引号,而字符串常量使用双引号。例如,a表示的是字符常量,而a 则表示的是只有一个字符长度的字符串常量。二者在内存中的存储也不同,字符常量存储的是字符的ASCII 码值,而字符串常量除了要存储有效的字符外,还要存储一个“字符串结束标志(0)”,以便系统判断字符串是否结束。例如,字符常量a在内存中占一个字节,其存储形式如图2-3所示。而字符串常量占用的字节数是字符串的总长度加1。额外增加的一个字节用于存放字符“0”。其在内存中的存储形式如图2-4所示。在实际应用时,
29、可以把一个字符常量赋予一个字符型变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量。但是可以用一个字符数组来存放一个字符串常量。字符数组将在数组一章介绍。2.6 不同数据类型之间的转换【理解】数据的自动转换和强制转换如果一个运算符两边的运算数类型不同,那么,要先将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,此过程由编译系统自动完成。这种转换又可以分为两种不同的情况。 当运算符两边是不同精度同一种数据类型时,编译器进行同一类型间的转换。float a;float b;double c;c=a+b;【说明】这时进行的就是浮点型之间的转换。虽然它们类型相同,
30、但仍要先转成double 型,再进行运算,结果也为double 型(注意:在VC 6.0 中,所有的float 类型数据在运算中都自动转换成double 型数据)。所以对于浮点型数据的转换方向可以描述为:float-double这表示float 类型向double 类型的转换。同样也可以将整型数据之间的转换方向描述为:int-long即如果一个long 型数据与一个int 型数据一起运算,需要先将int 型数据转换为long 型数据,然后两者再进行运算,结果为long 型数据。 参与运算的运算数类型不同,则先将它们转换成同一种类型,然后进行运算。转换方向可以描述为:int-double(float)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1