第2章 数据类型及运算_第1页
第2章 数据类型及运算_第2页
第2章 数据类型及运算_第3页
第2章 数据类型及运算_第4页
第2章 数据类型及运算_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章数据类型与运算问题原由用计算机解决问题既是直接的,也是精确的。然而,C语言是如何运用有限的存储空间实现精确计算?具有哪些运算规则和实现技术?如何实现对硬件的操作?等等,这些都是本章所要讨论的问题。

基本数据的存储、常用运算符与表达式、数据类型转换、位运算等。教学重点能力要求掌握:程序中各种运算关系和表达方式

了解:基本数据类型的存储方式

熟悉:数据类型的转换方法运和位运算的功能作用

本章介绍的知识内容第2章数据类型与运算

§2.5

编译预处理命令

§2.4

位运算

§2.3

基本运算

§2.2

常量与变量

§2.1

数据类型及其存储

§2.6

算法案例程序设计§2.1数据类型及其存储[实例2-1]计算并输出两个数的和

#include<stdio.h>voidmain(){inta=100000,b=200000;//定义两个整型变量,并赋值printf(“a*b=%d\n”,a+b);//输出两个数的和}[运行程序]a+b=300000在高级程序设计语言中,数据类型是一个非常重要的概念,如果数据类型定义不当,会使程序产生错误结果。2.1.1数据类型的引出2.1.1

数据类型的引出[实例2-2]计算并输出两个数的乘积

#include<stdio.h>voidmain(){inta=100000,b=200000;//定义两个整型变量,并赋值printf(“a*b=%d\n”,a*b);//输出两个数的乘积}[运行程序]a*b=-1478364802.1.1

数据类型的引出问题分析:两个程序同样的定义方法,为什么实例2-1的结果是正确的,而a*b出现负数,即乘法的结果是错误的?因为

100000*200000的结果已超出了C语言所能表示的整数的范围。对于实例2-2,我们可将变量a,b由整型改为实型。修改如下所示:

#include<stdio.h>voidmain(){floatta=100000,b=200000;

//定义两个实型变量,并赋值printf(“a*b=%f\n”,a*b);//输出两个数的乘积}[运行程序]a*b=20000000000.000000

2.1.2

数据的存储方式数据是程序处理的对象,也是程序设计所要描述的主要内容,数据类型是指编译系统对数据分配存储单元的安排,并且不同的数据类型分配不同的存储单元(长度)和存储形式。数据类型是对数据进行存储和操作、生成相应的程序代码所必不可少的信息。C语言中基本数据类型有:

整型:int实型:float字符型:char

其它类型数据都是基于这3种基本类型的。不同类型的数据在内存中占用的存储单元长度是不同的。因此,不同类型的数据具有不同的存储方式。

1、整数数据的存储方式

计算机中所有的数据(数字数据和字符数据)都是以二进制数进行存储的。例如一个十进制整数,先转换为二进制形式,例如整数10,以二进制形式表示是1010,然后才能存放到存储单元中。如果以字节(8位)为单位进行存储,最大存储容量为:11111111相当于十进制数的255,8位字节所表示的数值范围如下图所示:

2.1.2

数据的存储方式

2、实型数据的存储方式

对于一个整数,位数越多,表示的数据量越大。而对于实数,例如π的值为3.141596…,不是位数越多表示的数据量越大,而是位数越多,能表示得越精确。在计算机中一般以4个字节存储一个浮点数。并分成两个部分:一般用3个字节存放数值部分(包括数符),用1个字节存放指数部分(包括指数的符号)。

3、字符型数据的存储方式计算机中的字符包括英文字母、数字字符和特殊字符。计算机并不是将字符本身存放到存储单元中,而是按照ASCII将字符转换为代码存储到相应的存储单元中。例如,大写字母A相应的ASCII代码是65,而65用二进制表示为1000001,所以在存储单元中的信息是010000001(第1位补0,以凑足8位)。

2.1.2

数据的存储方式计算机中每一个存储单元中存放数据的范围都是有限的,而且为了处理数据的方便,不得不对数据进行限制和分类。C/C++语言的数据类型十分丰富,可分为基本数据类型和复合数据类型两类,如下图所示:2.1.3

数据的存储类型1、整型数据

整型(int)数据用来声明程序中的常量和变量的数据类型。下表给出了C语言中的整型数据类型,它是根据ANSI标准给定的类型。2.1.3

数据的存储类型类型标识符数据类型类型长度数值范围可用运算符

[signed]int有符号整型2/16-32768~32767

+,-,*,/,++,――,%unsigned[int]无符号整型2/160~65535[signed]short[int]短整型2/16-32768~32767Unsignedshort[int]无符号短整型2/160~65535[signed]long[int]长整型4/32-2147483648~2147483647Unsignedlong[int]无符号长整型4/320~4294967295

2、实型数据

实型也称为浮点型,C语言中的浮点型分为单精度浮点型(float)和双精度浮点型(double),主要用来表示含有小数点的小数(如0.618)或非常大的数(如3.14*1013)。C提供了三种浮点数据类型,如下表所示:2.1.3

数据的存储类型类型标识符数据类型类型长度数值范围有效位数可用运算符

float单精度型

4/32

±3.4(10-38~1038)7位数字+,-,*,/,++,――

double双精度型

8/64±1.7(10-308~10308)15位数字

longdouble长双精度型

16/128±1.2(10-4092~104092)19位数字

3、字符型数据

C语言中的char类型主要用来处理字符型数据。通常,一个字符数据占一个字节宽度的内存存储单元。并且在字符类型中,分为带符号字符型和不带符号字符型,如下表所示:2.1.3

数据的存储类型类型标识符数据类型类型长度数值范围

[unsigned]char无符号字符型1/80~255

[signed]char有符号字符型1/8-128~+127

[注意]不同的数据类型,在使用中有不同的规则,主要体现在以下几个方面:

(1)

表中类型标识符一栏中方括号内的内容是可选的,例如[signed]int通常简写为int。

(2)不同的数据类型有不同的操作。例如整型数可以取余操作,实型数据却不行;整型、实型数据可以进行加减运算,字符数据却不行。

(3)不同的数据类型出现的运算错误不同,例如整形数的错误是溢出;浮点数的错误是有效数字位不够而影响精度;如果类型定义错误(例如把实型定义为整型),将出现结果的完全错误。在进行程序设计时,要根据变量所描述的数据性质来确定数据类型,否则会得出错误结果。2.1.3

数据的存储类型§2.2常量与变量1、整型常量

(1)整型常量即为可带负号的整常数,没有小数部分。它可以用十进制、八进制和十六进制三种方法来表示。

(2)整型常量中的长整型用L作后缀,如87543L或87543l等。

(3)整型常量中的无符号型用U(或u)作后缀表示,例如6725U或6725u等。

(4)如果一个常量的后缀是U(u)和L(l),都表示为unsignedlong类型的常量,例如4933ul,37845LU,41156Lu等。

C语言中的数据对用户呈现的形式有两种:常量和变量。所谓常量,

是指在程序执行期间其值不发生变化的量。2.2.1常量2.2.1常量

2、实型常量实型常量在C中又称浮点型常量,它是由整数部分和小数部分(必须有小数点)组成的,并且只有十进制的表示方式。实型常量主要有两种表示法,小数表示法和指数表示法。实型常量的缺省为double型,后缀用F(或f)表示单精度(float)类型,后缀用L(或l)表示长精度(longdouble)类型。

3、字符常量字符常量是用一对单引号括起的一个字符,例如‘A’,‘+’,‘’(空格)等都是字符常量。C语言中的字符常量用关键字char来定义。2.2.1常量

3、字符常量

除了以上形式的字符常量外,在C中还提供了一种特殊形式的字符常量,即以“\”开头的字符系列,例如‘\n’代表一个换行符。下表列出了C语言中常用的这种特殊字符。形式ASCII值功能含义形式ASCII功能含义

\a0x07响铃\?0x3F(63)问号“?”

\b0x08退格符,移到前一列\\x5C(92)反斜线“\”

\f0x0C(12)换页符,移到下页首\’0x27(39)单引号“’”

\n0x0A(10)换行符,移到下一行\"0x22(34)双引号“””\r0x0D(13)回车符,移到本行\0

0字符串结束符\t0x09水平制表符,横向\ddd8进制数字符\vx0B(11)垂直制表符,纵向\xhh16进制数字符2.2.1常量

4、字符串常量双引号是字符串的定界符,字符串中可以包含空格符、转义序列或其它字符,也可包含C字符集以外的字符,如汉字等,只要C编译器支持汉字系统就可以。

[注意]字符常量与字符串常量之间的区别:

(1)

字符常量用单引号括起,而字符串常量用双引号括起。

(2)字符常量是用一个字符型变量存放的,并且一个字符常量在内存中仅占1个字节;而字符串常量是用一个一维字符数组来存放的,并且要占多个字节。在C中,凡是字符串都有一个结束符,该结束符用‘\0’表示。

(3)字符常量与字符串常量所具有的操作功能不同。字符串常量有连接、拷贝等功能,字符常量具有加法和减法运算,而字符串常量不具有这种运算。

2.2.1常量5、符号常量

当在一个程序中多次用到一个常量时,可用一个与常量相关的标识符来替代,这种相关的标识符称为符号常量。例如用PI来代表圆周率π(3.1415926)。在C语言中定义符号常量的方法有两种:一种是使用关键字const来定义符号常量,另一种是使用宏定义命令来定义符号常量。

[注意]类型定义时千万要注意常数大小与数据类型相一致:

(1)例如:constfloatPI=3.1415926;

(2)本例中尽管等号右边的常数是double型(3.141593后面没有长度说明则默认为double型),但因为符号常量的类型float只能存储7位有效位精度的实数,所以PI的实际值为3.141593(最后1位4舍5入)。如果将常量PI的类型改为double型,则能全部接受上述位数字。2.2.2变量变量是指在程序执行期间其值发生变化的量。变量一旦被定义了类型后,便受到类型保护,确保对其值不进行非法操作。在C语言中的变量有三种类型:整型变量、实型变量和字符变量。这些变量都具有三个基本要素:名字、类型和值。

1、变量命名

(1)系统规定的保留字(即关键字)不可再作为变量名、函数名、类型名等其它名字使用。

(2)命名变量应尽量做到“见名知意”,这样既有助于记忆,又增加了可读性。

(3)变量名字一般常用小写字母。

(4)变量名用多个字符构成,一般不要超过31个字符为宜。

(5)变量名中不能有空格,也不能包括除英文字符、数字和下画线之外的其它特殊符号。2.2.2变量

(1)<类型标识符>:为该变量的数据类型及类型修饰符,如int,float,unsignedshort等。

(2)<变量名>:用户定义的一般标识符,用来表示一个变量.

(3)<初值表达式>:C语言可用两种方法给变量赋值,一是在定义变量之后用赋值符“=”给变量赋初值;另外还可以在定义变量时直接给变量赋初值,这种赋值也称为变量初始化。

(4)省略号:表示在一条语句中可以定义多个变量,但各变量之间必须用逗号隔开。

2、变量定义定义变量是用一个说明语句进行的,其格式如下:<类型标识符><变量名>[=<初值表达式>],…,2.2.2变量

3、变量使用说明(1)在同一个程序块内,不允许定义同名变量,但在不同的程序块中,可定义同名变量。(2)将一个字符常量赋给一个字符变量并不是把该字符本身存放到内存单元去,而是将该字符的ASCII代码放到存储单元中。

[注意]在C语言中有字符常量,却没有字符串变量。那么,用什么类型的变量来存放字符串呢?在后面的章节中,我们将会介绍用字符数组来存放字符串。2.2.2

变量#include<stdio.h>main(){inta=3;doubleb=1.456;charr=‘A’;printf(“%d\n”,a);printf(“%f\n”,b);printf(“%d%f\n”,a,b);printf(“a=%d,b=%f\n”,a,b);printf(“%d\n”,10);printf(“%c\n”,r);printf(“%c,%d,%c”,r,r,97);printf(“%d”,b);

}31.45600031.456000a=3,b=410AA,65,a-1477468750运行结果:程序中的运算是由运算符与表达式来实现的。C语言中的运算符很丰富,因此表达式的种类也很多。按照运算符在表达式中的作用,可以分为6大类:

算术运算符关系运算符赋值运算符逻辑运算符逗号运算符条件运算符相应地,表达式也有6种对应类型。正是这些丰富的运算符和表达式,保证了各种操作的方便实现。这里,我们仅分别介绍前3种运算符与表达式。

后3种运算符与表达式在第3章中结合程序的控制结构一起介绍。§2.3基本运算运算符由字符组成,用来连接常量、变量、函数,以组成表达式。基本运算符指算术运算符、赋值运算符、逗号运算符。

1、算术运算符可分为双目运算符和单目运算符两种类型。

(1)

双目运算符:使用两个操作数的操作符称为双目运算符,包括:加(+)、减(-)、乘(*)、除(/)、求余(%)。双目运算符运算符名称运算实例运算功能+相加a+b求a与b的和-相减a-b求a与b的差*相乘a*b求a与b的积/相除a/b求a除以b的商%求余a%b求a除以b的余2.3.1基本运算符

[注意]C语言规定基础算术运算符的优先级同数学中的优先级一样,为先做*、/、%;后做+、—,而且前者优先级高于后者,其中有些运算符在计算中需要注意以下几个方面:①在5个基础运算符中,除%运算符只用于int型运算外,其它4个运算符对int型、float型和double型变量都适用。②“/”对于整型数来说是除法取整操作,例如5/2的结果为2;而对于实数来说是通常意义的除法运算,例如5.0/2.0的结果是2.5。③“%”取余(也称求模)只能对整型数进行操作,例如5%2的结果是1,4%2的结果是0。2.3.1基本运算符2.3.1基本运算符(2)单目运算符使用一个操作数的操作符称为单目运算符,包括:+(取正)、-(取负)、++(自增)、--(自减)。其表达式与应用规则,如下表所示:单目运算符运算符名称运算实例功能等价++自增++a或a++a=a+1--自减--a或b--a=a-1+取正+(a)+a-取负-(a)-a[实例2-6

]#include<stdio.h>voidmain(void){inta,b,k=10;a=k++,b=++k;printf(“k=%d,a=%d”,b=%d\n”,k,a,b);k=10,a=--k,b=k--;printf(“k=%d,a=%d”,b=%d\n”,k,a,b);}[运行程序]k=12,a=10,b=12k=8,a=9,b=92.3.1基本运算符2.3.1基本运算符j=3;k=++j;printf(“%d%d”,j,k);//k=4,j=4j=3;k=j++;printf(“%d%d”,j,k);//k=3,j=4j=3;printf(“%d”,++j);j=3;printf(“%d”,j++);a=3;b=5;c=(++a)*b;printf(“%d%d”,j,k);//c=20,a=4a=3;b=5;c=(a++)*b;printf(“%d%d”,j,k);//c=15,a=4

[问题点拨

]自增运算符(++)和自减运算符(--)是C/C++语言中特有的运算符,能使程序变得更为简洁。在使用时要特别以下几点:

(1)自增运算符和自减运算符只能用于变量,不能用于常量或表达式,例如7++或(a+b)++都是不合法的。因为7是常量,常量的值不能改变,而(a+b)++是无法确认和实现的。

(2)++和--的结合方向是“自右至左”,而运算符的结合方向是“自左至右”。如果表达式为-i++,那么,i的左边是负号运算符,右边是自加运算符。如果i的原值等于3,若按左结合规则,则相当于(-i)++,而(-i)++是不合法的,因为对表达式不能进行自加自减运算。2.3.1基本运算符2.3.1基本运算符

2、赋值运算符C语言的赋值运算符共有11种,可分为简单的赋值运算符、算术赋值运算符和位赋值运算符

⑴简单赋值运算符:就是用“=”来表示赋值运算。它的作用是将“=”右边的数据赋值给“=”左边变量。

⑵算术赋值运算符:是在简单赋值运算符的基础上扩充的赋值运算符。运算符运算符名称运算符类型运算实例功能等价+=加赋值双目运算a+=ba=a+b-=减赋值双目运算a-=ba=a-b*=乘赋值双目运算a*=ba=a*b/=除赋值双目运算a/=ba=a/b%=求余赋值双目运算a%=ba=a%b2.3.1基本运算符

3、逗号运算符逗号运算符是C/C++中一个比较特殊的运算符。使用逗号运算符“,”可以将多个表达式组成为一个表达式。逗号运算符的优先级是所有运算符中最低的。例如:

d1,d2,d3,d4

这便是一个逗号表达式,其中d1,d2,d3和d4各为一个表达式。

整个逗号表达式的值和类型由最后一个表达式决定。计算一个逗号表达式的值时,从左至右依次计算各个表达式的值,最后计算的一个表达式的值和类型便是整个逗号表达式的值和类型。2.3.2运算符的优先级与结合性一般而言,单目运算符优先级较高,赋值运算符优先级低;算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。2.3.3基本表达式

1、算术表达式由算术运算符和括号将运算对象连接起来的式子称为算术表达式,算术表达式的值是一个数值,运算对象包括常量、变量和函数等。

2、赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”,它的一般形式为:变量=表达式。

表达式是由运算符和操作数通过运算符连接而形成的一个有意义的算式,操作数包含了常量、变量、函数和其它一些命名的标识符。表达式的类型由运算符的种类和操作数的类型来决定,多种类型的表达式表现了C语言对数值运算和非数值运算的强大的功能。2.3.3基本表达式

3、逗号表达式由逗号运算符将两个表达式连接起来称为逗号表达式。

<表达式l>,<表达式2>【格式说明】

逗号表达式的值的求解过程是:先求解<表达式1>,再求解<表达式2>,整个逗号表达式的值为<表达式2>的值。例如,x=2*8,x*10,则x的值为16,整个逗号表达式的值为160。又例如,z=(x=10,10+20);则x的值为10,z的值为30。2.3.4表达式中的类型转换

1、自动类型转换自动数据类型转换也称隐含类型转换。在表达式中把一个值赋给与其不同类型的变量或函数的实参与形参类型不一致时操作系统会实行自动类型转换。转换规则如下:⑴将表达式中的char或short全部自动转换为相应的int型:将float转换为double型,如图2-4(a)所示。⑵当一个运算符两端的运算量类型不一致时,按“向高看齐”的原则,对“较低”的类型进行提升。如图2-4(b)所示。⑶一般的算术转换是在表达式的运算过程中自动进行的,如图2-4(c)所示。2.3.4表达式中的类型转换

注意:int型最低,double型最高。short型char型自动转换成int型,float型自动转换成double型,这种隐含的类型转换是一种保值映射,即在转换中数据的精度不受损失。chardouble←longfloat→double高Short↑↑unsignedcharlonglongunsignedshort↑↑floatdoubleunsignedunsignlong↑↑unsignedlongint←char,shortcharshort→int低

(a)(b)(c)图2-4自动数据类型转换floatint规则:对于数值类型,A的取值范围完全包含在B内AB隐含类型转换:自动类型转换2.3.4表达式中的类型转换

2、强制类型转换强制数据类型转换又称为显式转换。它是将某种类型强制性地转换为指定的类型,并且分为显式强制转换和隐式强制转换两种。

(1)

显式强制转换:它是通过强制转换运算符来实现的,其格式有如下两种形式:【格式说明】将<表达式>的类型强制转换成<类型说明符>所指定的类型。需要注意的是:

(a)这是一种不安全的转换。因为强制转换可能会出现将高类型转换为低类型的情况,这时数据精度要受到损失。因此,这是不安全的转换。

2.3.4表达式中的类型转换或<类型标识符>(<表达式>)(<类型标识符>)<表达式>【格式说明】将<表达式>的类型强制转换成<类型说明符>所指定的类型。需要注意的是:

(b)

这种转换暂时性的,是“一次性”的。例如:inta(3),m;doubleb;b=3.56+double(a);m=a+5;在b=3.56+double(a)表达式中,是通过显式强制转换a为double型的,而在其后的表达式m=a+5中的a仍然为int型的。可见,显式强制转换仅在强制转换运算符作用在表达式上时,该表达式被强制转换为指定类型,而不被强制转换时,表达式仍是原来类型。2.3.4表达式中的类型转换2.3.4表达式中的类型转换

(2)隐式强制转换

(a)在赋值表达式中,当左值(赋值运算符左边的值)和右值(赋值运算符右边的值)类型不同时,一律将右值类型强制转换为左值的类型。

(b)

函数有返回值的调用中,总是将return后面的表达式的类型强制转换为该函数的类型(当两者类型不一致时)。【实例2-7】求余运算“x%3”,其中“x”为float型,在程序中怎样实现这个求余运算。[问题分析]由于求余运算“x%3”要求于两侧均为整型量,而x为float型,显然是不合法的。但由于强制类型转运算的优先级高于%,因此可以先进行(int)x的运算,得到一个整型值,然后再对3求余。

[程序实现]#include<stdio.h>voidmain(void){doublex,inti;x=3.6;i=(int)x;printf(“x=%f”,i=%d\n”,x,i);}2.3.4表达式中的类型转换[问题点拨]

在程序设计中,有时运算表达式必须借助强制类型转换,否则,不能实现运算目的。此外,在函数调用时,有时为了使实参类型与形参类型一致,可以用强制类型转换运算符得到一个所需要类型的参数。位运算对字节或字节内部的二进制进行测试、设置、移位或逻辑运算。位运算是通过位操作符来实现的,位操作符是用来进行二进制位运算的运算符。C语言提供了6种位运算操作符,其优先级、结合方向、要求参加运算对象的个数及其作用如下表所示。§2.4位运算2.4.1位运算的特点运算符优先级作用要求运算符的个数结合方向~高低按位取反单目从右到左<<、>>左移、右移双目从左到右&按位与双目从左到右∧按位异或双目从左到右∣按位或双目从左到右位运算的运算量只能是整型或字符型的数据,不能为实型数据。C语言提供了两类位运算,一类是逻辑位运算,另一类是移位运算。2.4.2逻辑运算符

1、“按位与”运算“按位与”运算是将两个二进制位的操作数从低位(最右位)到高位依次对齐后进行与运算。其运算规则是:

1&1=1;1&0=0;0&1=0;0&0=0

逻辑位运算分为:“按位与”、“按位或”、“按位异或”和“按位反”等4种运算形式。逻辑位运算的运算对象只能是整形或字符型数据,不能为实型数据。2.4.2逻辑运算符

2、“按位或”运算“按位或”运算是将两个二进制位的操作数从低位(最右位)到高位依次对齐后进行与运算。其运算规则是:

1|0=1;0|1=1;1|1=1;0|0=0

2.4.2逻辑运算符

3、“按位异或”运算“按位异或”运算是将两个二进制位的操作数从低位(最右位)到高位依次对齐后进行异或运算。其运算规则是:

0∧0=0;1∧1=0;0∧1=1;1∧0=12.4.2逻辑运算符

4、“按位取反”运算“按位取反”运算用来对一个二进制数按位取反,即将0变1,1变0。2.4.3移位运算

1、“左移”运算左移运算用来将一个数的各二进位全部向左移若干位,将左边移出的的高位舍弃,右边空出的位补0。A的值a的二进制形式A<<1A<<2640100000001000000001000000001270111111101111111001111111002.4.3移位运算

2、“右移”运算右移运算用来将一个数的各二进位全部向右移若干位,将右边移出的的低位舍弃,左边高位空出的位要根据符号位的情况进行补充,对无符号数补0;对有符号数,若为正数则补0,若为负数则补1a:1001011111101101a>>1:0100101111110110(逻辑右移时)a>>1:1100101111110110(算术右移时)2.4.3移位运算

3、位运算赋值运算符同算术运算符与赋值运算符在一起可以组成复合赋值运算符一样,位运算符与赋值运算符可以组成5种复合赋值运算符,并由这些位运算赋值运算符可以构成位运算赋值表达式,如表所示:运算符运算符名称运算性质结合方向运算例子功能等价&=位与赋值双目运算从左到右A&=b

a=a&b∣=位或赋值双目运算从左到右a∣=b

a=a∣b∧=(XOR)位异或赋值双目运算从左到右a∧=b

a=a∧b~=位反赋值单目运算从右到左a~=b

a=a~b<<=左移位赋值双目运算从左到右a<<=b

a=a<<b>>=右移位赋值双目运算从左到右a>>=b

a=a>>b所谓“编译预处理”,就是在C/C++语言编译程序对C/C++源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。C/C++提供了三种类型的预处理命令:宏定义命令、文件包含命令和条件编译命令。为了与一般C/C++语句相区别,这些命令均以符号“#”开头。因此,在C/C++程序中凡是以“#”开头的行都为“编译预处理”命令行,凡是以“#”开头的命令都是预处理命令

宏定义命令是用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。宏定义命令有两种格式:一种是不带参数的宏定义(也称简单宏定义),另一种是带参数的宏定义。§2.5编译预处理命令2.5.1宏定义命令

1、不带参数的宏定义不带参数的宏定义是用一个指定的标识符(宏名)来代表一个字符串,它的一般格式为:或#define<宏名><字符串>#define<宏名>【格式说明】define是系统关键字,<宏名>是一个标识符,<字符串>是任意的字符序列。【注意】使用宏定义命令定义符号常量时,尽管它具有常量的属型,但在编译预处理完成后已不是一个具有一定类型的常量名(此时PI被字串3.1415926所替代)。因此,在随后的编译中再无法发现由它引起的数据类型误用的错误。2.5.1宏定义命令#definePI3.14#include<stdio.h>main(){floatr=1.0;floatarea=PI*r*r;printf("Theareaofthecircleis%f",area);return0;}2.5.1宏定义命令

2、带参数的宏定义宏定义不仅可以定义简单的宏名来表示字符串,而且还可以定义类似函数的带参数宏名和字符串(即宏体)进行参数置换。【格式说明】

<宏名>是一个标识符;<参数表>中可以有一个参数,也可以有多个参数,多个参数用逗号分隔;<宏体>是被替换用的字符序列。在替换时,<宏体>中与参数表中相同的标识符的字符序列被程序中所引用这个宏定义时所提供的与该标识符所对应的字符序列所替换。#define<宏名>(<参数表>)(<宏体>)2.5.2文件包含命令所谓“文件包含”,是指一个源文件可以将另一个源文件的全部内容包含进来。【格式说明】include是关键字,<filename>为要包含的文件名称,也称为头文件,表示预处理到系统规定的路径中去获得这个文件(即C编译系统所提供的并存放在指定的子目录下的头文件)。找到文件后,用文件内容替换该语句。

或#include<filename>#include“filename”2.5.3条件编译命令条件编译命令是用来定义某些编译内容要在满足一定条件下才参与编译的,否则将不参与编译。常用的条件编译命令有如下3种格式:或#ifdef<标识符><程序段1>#else<程序段2>#endif#ifdef<标识符><程序段1>#endif1.格式一【格式说明】其中:ifdef,else和endif都是关键字。<程序段1>和<程序段2>是由若干条预处理命令和语句组成的。2.5.3条件编译命令2.格式二【格式说明】

其中:ifndef,else和endif都是关键字,其余同格式一。当<标识符>未被定义时,则<程序段1>参与编译,否则<程序段2>参与编译。在省略#else时则无<程序段2>,当<标识符>已被定义时,便去执行#endif后面的程序。

或#ifndef<标识符><程序段1>#else<程序段2>#endif#ifndef<标识符><程序段1>#endif3.格式三【格式说明】

其中:ifndef,else和endif都是关键字,其余同格式一。

#if<常量表达式1><程序段1>#elif<常量表达式2><程序段2>#elif<常量表达式3><程序段3>#else<程序段n+1>#endif2.5.3条件编译命令1、案例描述

根据公式:sum=money*((1+rate),year)计算存款到期时的本息合计sum(税前),输出时保留两位小数。2.案例分析设三个变量,存款金额money和存期year为整型变量,年利率rate为浮点型变量rate。输入:从键盘输入存款金额money、存期year、年利率rate。输出:本息合计sum(保留两位小数)。3.算法描述sum=money*((1+rate),year)§2.6算法案例程序设计2.6.1计算银行存款的本息2.6.1计算银行存款的本息#include<stdlib.h>#include<math.h>intmain(){intmoney,year;doublerate,sum;printf(“Pleaseinputmoney:”);scanf(“%d”,&money);printf(“Pleaseinputyear:”);scanf(“%d”,&year);printf(“Enterrate:”);scanf(“%1f”,&rate);sum=money*pow((1+rate),year);printf(“sum=%.2f\n”,sum);}4、程序实现[运行结果]Pleaseinputmoney:5000↙Pleaseinputyear:3↙Pleaseinputrate:0.03↙Sum=5463,641、案例描述对于年、月、日的描述,不同国家有不同的描述方式。英国式的写法(日/月/年)和美国式的写法(月/日/年)。输入:从键盘输入正确的年、月、日输出:中、英、美式的日期写法。

2.案例分析设year表示年,month表示月,day表示天,类型均为整型。

3.算法描述

(1)输入年、月、日给变量year、month、day;

(2)输出中国式的日期写法;

(3)输出英国式的日期写法;

(4)输出美国式的日期写法。2.6.2日期写法#include<stdlib.h>main(){intday,month,year;printf(“year,month,day=\n”);scanf(“%d%d%d”,&year,&month,&day);printf(“DateinPRCformis%d%d%d\n”,year,

month,day);printf(“DateinUKformis%d%d%d\”,day,month,year);printf(“DateinUSAformis%d%d%d\n”,month,day,year):system(“pause”);}4、程序实现2.6.2日期写法

1、案例描述编写一个C语言程序,能随机产生一个四位整数,同时给出各位数字和。2.案例分析

⑴用库函数中的随机函数rand()产生一个随机的整数:rand()是一个返回随机整数的函数,它能够生成在0到RAND_MAX之间的任意整数,而且每个整数出现的几率均等。需要注意的是,这个函数和RAND_MAX均定义在stdlib.h这个库中,所以要使用随机数必须要包含这个库。如何生成在a到b中的任意整数呢?这里提供两种办法:

①a+rand()%(b-a);②a+rand()/RAND_MAX*(b-a)。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论