第三章C语言基础_第1页
第三章C语言基础_第2页
第三章C语言基础_第3页
第三章C语言基础_第4页
第三章C语言基础_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 C语言基础本章学习目标:l 掌握C语言的数据分类及基本类型数据的表示方法l 掌握变量的定义及使用l 掌握C语言数据的输入输出函数的使用l 掌握C语言基本的算术运算规则及运算优先级l 掌握最简单的文件数据的读写操作l 掌握C语言标准函数的使用方法31 C语言程序311 程序三件事:输入数据、处理数据、输出结果从一般意义上说,一个计算机程序通常需要接收从计算机外部输入的数据,然后对数据进行必要的加工处理,并将处理的结果以某种形式输出出来,有的计算机程序不需要输入数据,只产生并输出计算机处理的结果。使用计算机解决问题就是要将需要解决的问题转化成一个数据处理的问题,然后设计一个解决这种数据处理

2、问题的算法,根据算法编写出计算机程序,然后再计算机上运行这个程序以便解决所需要解决的问题。图3-1给出了运用计算机程序的求解问题的基本方式。问题设计算法编写程序运行程序问题的解图3-1 运用计算机程序求解问题的方式输入数据:把外部的数据借助于输入设备输入到计算机的内存。如键盘、鼠标、扫描仪等设备都是输入设备,因此如果要将数据从输入设备输入到计算机内存,必须清楚的知道是从什么设备输入,因为有多种设备都可以实现数据输入。有一种设备叫做标准输入设备,所谓标准输入设备指的是在进行输入时不需要特别指明的设备,即缺省认定的输入设备,在C语言中,标准输入设备是键盘。C语言的数据输入是利用C语言提供的标准函数

3、实现的,这些函数不需要指出从什么地方输入,特指从键盘输入数据,3-7节介绍数据输入标准函数。处理数据:指程序对计算机内存中的数据进行必要的加工处理,得到数据处理所需的结果。常见的处理形式如计算、数据变换等,C语言中不光可以进行算术运算,还可以进行逻辑运算,与其他程序设计语言相比,C语言提供了更加丰富的运算,以适应不同的数据处理需要,能够进行更加丰富的运算显然显然可以给我们书写程序带来方便,但也为我们学习掌握带来了一定的困难,比如我们日常使用的加减乘除四则运算,运算的优先顺序只有两种,即先乘除后加减,在程序设计语言中运算的优先顺序称为运算优先级,而C语言提供了超过10种不同的运算优先顺序,在一个

4、表达式中如果出现多种不同的优先级时,常常是容易出现混淆,关于运算的优先级,将在引入新的运算的时候加以介绍,3-4节介绍C语言的基本运算及其运算优先级。输出数据:将计算机内部的数据借助于输出设备输出到某个特定的输出设备中,程序的目的是处理数据,如果处理的结果只是存储在计算机内部而不一某种形式提供给人,那么数据处理就没有什么必要,除非我们不需要这些处理结果,我们最常见的需要时将结果显示出来或者将结果打印出来等等,在C语言中缺省的输出设备是显示器,即如果不加特别说明的话,输出数据是只将数据显示出来,实现数据输出在C语言中式通过C语言提供的标准函数实现的,3-6节介绍输出标准函数。32 程序处理的数据

5、321 数据的含义如前所述计算机程序的基本任务就是处理数据,无论是数值还是文字、图像、图形、声音、视频等信息,如果要在计算机中处理的话,就必须将它们转换成所谓的数字信息,因为计算机中只能存储数字,甚至连计算机程序都是由数字组成的,所以在使用计算机程序解决问题的时候,首先需要把需要处理的信息数字化,即使用数码表示需要处理的信息,如果我们要处理图像信息,可以把一副图像可以看做是由m行n列的点组成的,每一个点是一种颜色,每一种颜色可以使用三个数据(R、G、B)来表示,R表示红色的比例、G表示绿色的比例、B表示蓝色的比例,这样就可以用个数据表示一副图像了。再比如我们需要处理文字信息,比如英文,文字是由

6、字母及一些标点符号组成的,我们可以将每一个符号用一个数字来表示,例如在ASCII编码标准中,用65表示字母“A”,用66表示字母“B”等等,只要把我们所使用的每个符号都进行编码(数字化),我们就可以在计算机中处理文字信息了,总之,不论什么信息,如果要使用计算机程序来处理的话,就必须进行数字化,即将它们转换成数字表示的形式,才能够在计算机中处理。如果我们使用C语言书写的程序处理数据,由于任何信息在计算机中都是以数据的形式存在的,表示数据的形式可能就多种多样,于是就出现了这样一些基本问题,在C语言可以使用那些种类的数据?每一种类型的数据的书写形式是怎样的?数据在计算机中存储在什么地方?数据如何进行

7、加工处理?如何将数据输入到内存或者如何输出数据呢?本章的其余部分将详细讨论这些问题。322 数据的种类C语言是一种计算机语言,是用来书写计算机程序的语言,而计算机程序是处理数据的,在大多数计算机语言中,数据是分类的,C语言的数据种类可以分为三类:基本数据类型、复杂数据类型和空类型三大类数据。基本数据类型的数据是指数据不能再进一步分解的数据,如172、36.5、A等都属于基本类型的数据,这些数据都不能再分解成其他的数据形式了,一个复杂数据类型的数据是由若干个其他类型的数据组成的,空类型是C语言的一种特别的数据类型,在函数和指针的章节中将讨论它的使用。C语言的各种数据类型如图3-2所示。数据类型基

8、本数据类型复杂数据类型空类型整数实数字符枚举指针数组结构体共用体图3-2 C语言数据类型1 整数类型数据整数类型数据是指没有小数点的数据,有小数点的就不是整数,这与我们日常使用习惯是不同的,12和12.0在C语言中是两个不同类型的数,基本整数数据类型的类型名是int,在定义变量的时候需要使用数据类型标识符,在C语言中,整数分成若干类,每种类型分别可以表示不同的数据范围,表3-1表示了整数的类别及对应的数值范围,需要说明的是,不同版本的C语言同一数据类型表示的数值范围可能是不同的,本书是以TURBO 2.0为标准。表3-1 整数数据的类型及数值表示范围类型数据类型名二进制位数数值范围基本整数si

9、gned int16-3276832767 即无符号整数unsigned int16065535 即短整数signed short int16-3276832767 即无符号短整数unsigned short int16065535 即长整数long int32无符号长整数unsigned long int32需要指出的是不同的数据种类是为了适应不同的数据处理的需要,但每种类型的数据都有数值表示范围,在本书中我们绝大多数情况都使用基本整数类型的整数(int类型)。2 实数类型数据实数就是带小数点的数,而且书写程序时实数必须有小数点,TURBO C中,实数由三类:单精度实数、双精度实数、长双精度

10、实数。表3-2 实数数据的种类及其数值表示范围类型数据类型名二进制位数有效数字数值范围单精度实数float3267双精度实数double641516长双精度实数long double12818193 字符类型数据字符类型数据主要是为了满足文字处理的需要而设计的数据类型,因为文字(西文)是有符号组成的,字符数据类型的类型名是char,在内存中,字符数据是以ASCII编码的形式存储的,即使用1个字节存储一个字符,由于使用编码表示字符,所以这种类型的数据也可以当做一个单字节的整数使用。4 枚举类型数据枚举数据类型是一种自定义数据类型,它不是C语言提供的标准数据类型,使用这种数据类型需要在程序中先定义

11、这种数据类型之后,才可以使用这种数据类型,关于枚举数据类型在相关章节中介绍。5 指针类型数据指针数据类型是C语言中最有特点的数据类型,整数类型的数据是不带小数点的数,实数类型的数据是带小数点的数,字符类型的数据是ASCII字符集的符号,指针类型的数据就是内存地址,所以指针数据类型实际上就是“地址数据类型”,因为指针是个更加形象的说法,所以普遍使用的名称是指针数据类型,第8张介绍指针。如图3-2所示,C语言将数据分成了若干类,一个基本的问题是为什么要对数据进行分类?比如为什么要把实数与整数区分成两类,我们平时使用时不加以区分的,在C语言中就必须区分,这是为什么?01010图3-3 两个字节拼接的

12、二进制数我们以整数和实数为例来说明在C语言中区分整数类型和实数类型的必要性,数据时存储在计算机的内存中的,计算机的内存是由一系列小的存储单元组成,一个存储单元能够存储若干位二进制数,在目前流行的个人计算机中,一个存储单元通常存储8位二进制数,在C语言中,整数是使用补码形式的二进制存储的,即在内存中存储的是该整数对应的补码形式,如果用一个8位的二进制如果用来存储一个有符号的整数的话,那么8位二进制所能存储的最大正整数是127,最小的负数是-128,为了能处理更大范围的数据,人们把几个连续的存储单元“拼接”成一个更大的存储单元,用来存储更大范围内的整数,比如基本的整数类型的数据是由2个字节的存储单

13、元“拼接”成的,也就是说存储一个整数需要两个字节的存储单元,例如整数522的二进制形式是,那么在内存中存储的数据就是16位二进制数,如图3-3所示。对于实数的存储,则采用与整数存储完全不同的存储形式,实数是采用浮点存储形式存储数据的,基本的实数采用32位浮点格式存数,其存储格式如图3-4所示,数据由三部分组成,符号部分、指数部分和基数部分,这种表示方法的最大的优点是可以大大地扩大数值的表示范围,其表示的数值大小是,只不过这里的数据都是二进制形式。由此可见整数的存储形式与实数的存储形式完全不同,所以将它们作为不同的数据类型是必要的,因此在多数计算机语言中,数据总是分类的,除此之外数据分类之后还能

14、对程序设计带来好处。eds符号部分指数部分基数部分图3-4 实数的浮点存储形式需要特别注意的是人和类型的数据在计算机内部存储只能使用有限位二进制来存储,这意味着在C语言(其他计算机语言也是如此)中,任何基本类型的数据,数据都存在着一个有限的表示范围,超出这个范围的数据就不能处理或者处理结果与预期的不一致,比如在TURBO 2.0中使用16位二进制表示一个基本的整数,那么整数的表示范围就是:-3276832767,超过这个范围内的数据就不能使用基本的整数类型的数据存储了。323 (常量)数据的表示在许多程序设计的书中,是这样定义常量的,说常量是在程序运行过程中其值不能改变的两,这话非常正确,但对

15、于初学者是很难理解的,我们给一种更为简单易懂的说法,常量就是在书写程序的时候使用的常数。既然数据是分类的,接下来的问题自然是对于每种类型的数据,其书写格式是什么,对于不同数据类型的数据,C语言有着不同的书写规则,本章介绍整数、实数、字符和字符串类型数据的书写规则,其他类型的数据在相关的章节中介绍。1整数的表示在C语言中,整数一定没有小数点,有小数点的一定不是整数,我们在日常中,12和12.0似乎没有什么不同,但是在C语言中,这是两个不同类型的数,12是整数而12.0是实数,整数可以用三种方式来表示,即在书写程序的时候,可以使用三种方式书写,这三种表示形式是十进制形式、八进制形式和十六进制形式,

16、一般情况下我们都使用十进制表达形式,因为这与我们的日常使用习惯相同,但在一些特别的数据处理的时候,八进制和十六进制则是更好的数据表达形式,比如进行位操作的时候。基本的整数是由16位二进制存储的,所以它的数据表示范围是:-3276832767,即最小的整数是-32768,而最大的整数是32767。(1)十进制形式,十进制形式是我们最熟悉的表达形式,十进制数的书写规则是由正负号开头,后跟一个自然数的形式,如果是正数,正号可以省略。例如:-213、0、415、76、+83都是合法的整数,而123.0、-23.、0123等都是非法的十进制整数表达形式,这里0123是一个合法整数,但不是一个合法的十进制

17、整数形式,它是一个合法的八进制形式,123.0和-23.是合法的实数,和不是合法的C语言书写形式。(2)八进制形式,在C语言中,可以使用八进制形式表示一个整数,八进制数的书写规则是以数字0开头,后跟一个八进制形式的数,如果是负数,则以负号开头。例如:0123、-087、00、+0327等都是合法的八进制形式,而321、028、-0921都是非法的八进制形式,需要特别注意的是0123不是“一百二十三”,0123是一个八进制数,其对应的十进制数是83,另外一个八进制数中式没有“8”和“9”这两个符号的,所以028、0921都是错误的八进制形式。(3)十六进制形式,以“0x”开头,后跟一个十六进制数

18、,例如:0xff03、0x123、0xAc7等都是合法的十六进制形式,而x37、287都是非法的十六进制形式。2实数的表示实数是带小数点的数,使用C语言书写程序时,实数可以用两种方法书写,它们是十进制形式和指数形式。(1)十进制形式,这种书写形式与我们日常使用的书写形式非常类似,其中整数部分或小数部分都可以省略,但不能同时省略。例如123.45、12.、.986都是合法的实数形式,12.就是12.0,,.98就是0.98,没有小数点的数不能作为实数。(2)指数形式,对于很大或者很小的实数,实数的指数形式的书写规则是:e这里d是一个整数或者一个十进制形式的实数,n必须是一个整数,n可以是正数,也

19、可以是负数,表达的数值的大小是,例如:1.2e3表示=1200.0、2.78E-3表示=0.00278,字母e大小写均可以。3字符数据的表示字符类型的数据有两种基本的表达形式:基本表示形式和转义符表示形式,字符在内存中存储的是该字符的ASCII编码值,字符类型的数据类型名是char,由于字符数据存储的就是一个字符的编码数值,所以字符数据也可以当做一个整数,只是需要特别注意这是一个1个字节表示的整数了。(1)基本表示形式,使用单引号将一个字符引起来就是一个字符常数。例如A、f、$、+、*等都是字符常数,而ab、d等都不是C语言的字符,需要注意的是a和A是不同的字符,因为他们具有不同的ASCII编

20、码。(2)转义符表示形式,C语言中,有时候使用以反斜杠“”开头的字符序列表示一个字符,常见的转义符形式如表3-3所示。 表3-3 转义符及其含义转义符形式表示的字符ASCII编码值n换行,这可能是使用最多的转义符10t水平制表符(Tab)9b退格8r回车13f换页12反斜杠字符“”92单引号字符“”39”双引号字符“”34ddd1到3位八进制表示的字符xhh1到2位十六进制表示的字符例如101表示字符A,因为八进制101对应的十进制数是65,而A的ASCII编码值就是65.,同样的道理x41也表示字符A,因为十六进制数41对应的十进制数也是65。4字符串数据的表示字符换是用双引号引起的一串字符

21、,例如“This is a program.”、“Hello”、“It is a string”等都是字符串,需要注意的是一个字符串是以字符0结束的,存储“Hello”这个包含5个字符的字符串需要6个字节,因为字符o之后需要存储一个0,“Hello0Tom”这个字符串只有5个而不是8个、9个或者10个字符,因为遇到0字符串就结束了,“Hello0Tom”与“Hello”是两个相同的字符串,这似乎有点奇怪,但C语言就是这么规定的。5符号常数就像我们平时使用符号表示常数一样,比如我们用表示3.,在C语言中叶可以用符号表示常数,不过需要先定义这个常数,定义一个符号常数的格式是:#define 常数例

22、如:#define PI 3.1416意思是将PI定义为3.1416,相当于为常数3.1416起了个名字PI,定义了之后再程序中就可以使用PI这个常数了,PI就代表3.1416。需要注意的是常数定义一般在函数的外部定义,常数名通常使用大写字母,这主要是为了能够区分常数和变量,变量的名字通常是使用小写字母表示的。33数据的存储331 存放数据的单元-变量x2000327变量名变量值变量地址图3-5 变量示意图计算机程序在处理数据的时候,总是需要将处理的数据存储在内存的某个存储单元,并且这些存储单元必须能够方便地使用,在C语言中,使用变量来存储数据,简单说变量就是一个有名称的存储单元,在程序运行过

23、程中可以随时改变变量(存储单元)的数值,通过变量的名字来使用变量,这就为我们在程序中使用存储单元带来了方便,比如x和y都是变量,其中存储的是两个整数,可以使用“printf(“%d %dn”,x,y)”将x和y的数值显示出来,也可以把几个计算结果存入x或者y中,比如“y=x+1”表示把“x+1”的数值存储到变量y中。由于在C语言中数据是分类的,存储不同类型的数据需要的存储单元的数量(字节数)是不同的,比图存储一个整数需要2个字节,存储一个实数需要4个字节,而存储一个字符只需要1个字节,所以变量也是分类的,一个变量只能存储一种类型的数据,图3-5 给出了变量的一个名字为x、变量的内存地址为200

24、0、存储的数值为327的变量的示意图,所以当我们需要一个变量的时候,必须清楚两个问题:(1)这个变量的名字叫什么?名字是由书写程序的人起的。(2)这个变量存储什么类型的数据?C语言是通过变量定义的方法来说明这两个问题的。332 如何获得变量(存储单元)-定义变量变量定义解决如下问题:(1)获得一个存储数据的存储单元。(2)为这个存储单元七个名字。(3)规定这个存储单元存储的数据类型(4)如果需要还可以为这个存储单元设置一个初始数值。1标识符-命名在书写程序的时候,我们需要为使用的变量命名,也就是为变量起个名字,C语言使用标识符为变量、符号常数和函数命名,标识符简单说就是一个名字,但名字命名必须

25、符合一定的规则,即不能随意起名字,C语言的标识符命名规则是:l 标识符由如干字符组成。l 组成标识符的字符只能是字母(大小写均可)、数字符号和下划线(_)三种符号。l 开头字符必须是字母或下划线,即数字不能作为标识符的第一个字符。l 关键字不能作为标识符关键字是指在C语言中赋予特定含义的一些词汇,一些C语言的语句使用了一些单词,这些单词就不能再作为变量或者函数的名字了,例如数据类型标识符“int”、“float”、“char”、“long”在C语言中都由特定含义了,就不能再作为变量或函数的名字了,附录B中列出了C语言的关键字。例如:count、x、a123、_str、_x、_3_、_都是合法的

26、标识符,这里“_”是一个合法的标识符看起来非常奇怪,我们肯定不会用作为一个变量或者函数的名字,但它是合法的标识符,下列都是非法的标识符:3cad 标识符开头不能是数字(3)count-1 使用了标识符不允许的符号(减号)pro1.c 使用了标识符不允许的符号(点)for for是一个关键字从C语言语法规则上说,任何合法的标识符都可以作为名称,除非是关键字,但实际使用时命名都有一定的规范,一般性的原则是使用有含义的英文名称来命名,这样做的好处是可以比较好地理解数据所表达的含义。2变量定义C语言规定,任何变量都需要“先定义后使用”,变量定义解决本小节开头提出的4个问题,变量定义使用说明语句实现的,

27、说明语句的格式是: 数据类型名可是int、float、char、double等所有C语言允许的数据类型名,变量名列表就是用逗号将若干变量名分隔开的一些列变量名。例如基本整数类型的数据类型名是int,则变量定义:int x,y;的含义是:(1)获得两个存储数据的存储单元。(2)这两个单元的名字分别叫x和y。(3)每个变量(x和y)只能用来存储一个整数(-3276832767之间的一个数)。(4)每个变量(x和y)中存储的数据是不确定的(一个随机的数值)。变量定义float x;的含义是:(1)获得一个个存储数据的存储单元。(2)这两个单元的名字叫x。(3)变量x只能用来存储一个实数(之间的一个数

28、)。(4)变量x中存储的数据是不确定的(一个随机的数值)。变量定义char ch;的含义是:(1)获得一个个存储数据的存储单元。(2)这两个单元的名字叫ch。(3)变量ch只能用来存储一个字符(ASCII字符)。(4)变量ch中存储的数据是不确定的。在TURBO C中说明语句必须放在程序的执行部分之前,即程序的说明语句的前面不允许出现C语言的执行语句或者函数。3变量的初始化前面定义变量的例子中变量的初始数据都是不确定的,但也可以通过初始化来为变量设定一个初始数值,所谓变量初始化指的是在定义变量的同时对变量设定一个初始值,初始数值只要是一个合法的常数表达式就可以了。例如变量定义int x=7,y

29、=5+3;的含义是:(1)获得两个存储单元。(2)两个存储单元的名字叫x和y。(3)每个存储单元只能存储一个整数。(4)x变量的初始数值是7,而y变量的初始数值是8,因为5+3=8。任何变量在定义的时候都可以根据需要进行初始化,当然也可以不进行初始化,完全取决于需要。变量定义char x=A,y=66,z;的含义是:(1)获得三个存储单元。(2)两个存储单元的名字叫x和y。(3)每个存储单元只能存储一个字符。(4)x变量的初始数值是A、y存储的初始数值是字符B,因为字符B的ASCII编码是66,而z变量的初始数值是不确定的。任何变量在定义的时候都可以根据需要进行初始化,当然也可以不进行初始化,

30、完全取决于需要。333 如何使用变量(存储单元)变量一旦定义了之后,在程序的执行部分就可以使用变量了,如果使用没有定义的变量,比如使用了没有定义的变量y,C语言编译会给出语法错误:Undefined symbol y in function main意思是你的主函数中使用了一个没有定义的变量y。变量基本使用方式有两种:(1)存储一个数据;(2)用在一个表达式中。1存储数据,经常需要将一个数据保存到一个变量中,实现这一功能是用赋值语句完成的,赋值语句的基本格式是:=这是我们引进的第一个C语言语句,它也可以当做一个表达式(见3.4节),等号的左侧是一个(只能是一个)变量名,等号的右侧是一个表达式,

31、赋值语句的功能是将右侧的表达式的计算结果存放到左侧表示的变量中。表达式的计算结果总是属于某一种数据类型的数据,而变量也只能存储一种固定类型的数据,等号两侧的数据类型要尽量保持一致。假设“int x,y;”,即x和y都是整型变量,那么“x=5*7;”表示把5*7的计算结果(35)存放到变量x中,“y=3*x;”表示把3乘以x的计算结果存放到变量y中。特别地“x=x+1;”表示将x加1的结果存放到变量x中,这个操作在程序设计的时候是非常频繁使用的,注意这里不是等式,等号“=”的含义是赋值,千万不能把它看做一个方程式。2在表达式中使用变量,程序的核心任务就是处理数据,处理数据的最常见的方式就是通过计

32、算来完成的,计算是通过表达式来实现的,变量数据可以出现在一个C语言表达式中,例如“x+3”就是计算x+3的结果,如果变量x中存储的数据是5,则表达式“x+3”的计算结果就是8,在3.4节详细讨论C语言的运算及C语言表达式。 334 变量(存储单元)的容量一个数据在计算机中可以使用一个变量来存储,不同类型的变量存储使用不同位数的二进制来存储数据的,例如一个字符类型(char)的变量使用1个字节的内存电源存储数据,一个基本整数类型(int)的变量使用2个字节的内存单元来存储数据,而一个单精度实数(float)类型的变量使用4个字节的内存单元来存储数据,即每种类型的变量都使用固定位数的二进制的存储单

33、元来存数数据,这样一来就出现了一个基本的问题,那就是:任何数据类型的变量都只能存储优先范围内的数据。表3-1和表3-2分别表示了整数类型和实数类型变量能够存储的有效数据范围,这就出现了一个问题,当试图将一个超出了C语言有效数据范围内的数据存入一个变量中的时候,会出现什么情况呢?1不同类型数据占的内存字节数计算在TURBO C中,一个字符类型的数据占一个字节,一个基本整数占2个字节,一个单精度实数占4个字节,实际上在不同版本的C语言中,耨中数据类型的数据所占的字节数是有所不同的,可以使用C语言提供的一个sizeof运算来计算某种数据类型的数据所占的字节数,sizeof运算的使用格式是:sizeo

34、f(数据类型名)例如: sizeof(char) 计算一个字符数据所占字节数 sizeof(int) 计算一个基本整数数据所占字节数 sizeof(float) 计算一个基本实数数据所占字节数 sizeof(double) 计算一个字双精度实数据所占字节数2C语言编译时不进行数据范围有效性检查,不论字符、整数环视实数,当将一个超出了该类型有效存储范围内的数据存入一个变量的时候,只要不是数据表示错误,例如程序中出现如下表示:char ch;int x;float y;ch=321;x=76543;y=2.3e56;编译时C语言均可以通过语法检查的,不会报出任何错误信息,实际上这三个数均超出了对应

35、数据类型的表示范围。3实数数据超出范围运行程序会出错,在程序运行过程中,如果试图将一个超出实数表示范围的实数数据存入一个数型变量时,将会出现错误结果,例如:float x;x=2.3e56;显然这个数超出了单精度实数的有效范围,运行程序时,会将一个特别的数据“NAN”(not a number)存入变量x,以后所有使用变量x的地方计算结果均是错误的结果“NAN”。如果将变量x输出,将会显示:+INF或者-INF表示显示的数据超过了正或负数的允许范围。如果程序试图将一个超出实数范围的实数常数显示出来,则会显示:Floating point error: Domain即出现浮点错误。4运行程序时,

36、如果整数、字符数据超出范围,将简单地将“多余”部分丢掉,什么叫多余部分呢?我们看一个例子:char a,b;a=A;b=5*a;a是一个字符类型的变量,在内存中占1个字节,字符数据在内存中存储的是该字符对应的ASCII编码值,大写字母A的ASCII编码值是65,因此变量a中存储的是整数65,请问执行了语句“b=5*a”之后,变量b中存储的是什么?答案是字符E,需要解释的是为什么是字符E,首先字符A的ASCII编码值是65,对应的二进制是,所以变量a中存储的是: 010000015*a=5*65=325,把325转化成二进制就是,这是一个9位的二进制数,将这个数存入变量b的时候,直接把低8位二进

37、制数存入了变量b中,因为变量b装不下9位二进制,因此,变量b中存储的数据是: 01000101这个数对应的十进制数是69,刚好是大写字母E的ASCII编码值,所以变量b中的值是字符E。对于字符类型的数据,执行b=,假设表达式的计算结果为整数N,那么变量b中存储的数据是:N MOD 256 MOD表示求余数运算即变量b中存储的是N乘以256的余数,因为325 MOD 256=69,所以变量b中存储的是整数69,刚好是字符E。再看整数的情况,整数数据与字符数据非常类似,只是一个整数是使用16位二进制存储的,当试图将一个超出整数范围(-3276832767)的数据存入一个整数变量的时候,也是简单地将

38、高位“多余”二进制丢掉,例如:int a,b,c,d;a=32767;b=a+1;c=-32767;d=c+c;那么变量b中存储的数值是-32768,而变量d中存储的数值是2,先看a+1的运算结果,32767是最大的二进制基本整数,其16位内存存数形式是:01111111111111111这个数+1就是: 10000000010000000这个数对应的十进制数就是-32768,因为-32768的16位二进制补码形式就是:00000同样c+c=(-32767)+(-32767)的结果是: 10000000010000001 10000000010000001两个数相加的结果是: 00000000

39、0100000101这是一个17为的二进制数,丢掉最高位,变为16位数,这个16位的数就是变量d中存储的数: 00000000010000010所以变量d中存储的数值是整数2。TURBO C中更加令人困惑的是当字符类型的数据参与算术运算的时候,会把字符数据看做一个8位的有符号的整数,这就会出现一些非常奇怪的结果,比如:char a;int b;a=128;b=129+a;执行这段代码之后,变量b中的结果是什么?129+128=257似乎是个合理的结果,但TURBO C算出的结果是1,显然计算的是129-128=129+(-128)的结果,为什么是这样呢?因为变量a中存储的是128对应的二进制数

40、,这个数当做8位整数看时就是-128,因为最高位表示符号,所以才会计算出b=129+a=1这样奇怪的结果。在C语言中整数类型、字符类型的数据不进行越界处理,所以使用整数类型数据、字符类型数据进行运算的时候,需要特别注意数据范围,避免出现越界,一个基本整数在内存是一个16为二进制,用补码形式存储数据,数据表示的范围是-3276832767,-32768的16位补码形式是00000,32767对应的16位补码形式是11111,超出这个范围内的部分(高位)将被简单地“丢掉”,比如32767+2=-32767、32767+3=-32766,等,请问32767+32767=?,如果不能计算出来请到计算机

41、中计算一下,然后找出理由。当初始化变量的时候,对于整数、字符类型的数据,C语言只是简单地将等号右侧的常数简单地转换成二进制并存入变量中,不进行数据越界检查,这对于整数数据、字符数据的使用有时候会带来很大的麻烦,这时候需要特别注意数据是否在表示范围内,如果不在数据表示范围内,则可能出现意料之外的结果,例如:int a=65535变量a中存储的初始数据到底是什么?如果把a显示出来,会看到显示结果为-1,为什么会显示-1呢?原因是int类型的数据是由16位二进制表示的,其数据表示范围是-3276832767,把65535转换成二进制就是16个1,即65535的二进制形式是11111,所以变量a的初始

42、数据就是11111,而基本整数是以补码形式表示的,-1的16位补码形式就是11111,所以变量a的初始数值是-1。类似地对于int a=32768,b=65536,c=65539;变量a的初始数据是-32768,变量b的初始数据是0,变量c的初始数据是3,设变量的初始数据位N(N为一个常数或者常数表达式),则整数变量的初始数值实际是N除以65536的余数对应的二进制,65536 MOD 65536=0,所以变量b的初始数值是0,65539 MOD 65536=4,所以变量c的初始数值是4,65536=B,很纠结吧,对于字符类型的数据,也有类似的情况,例如:char ch=321;因为字符类型的

43、数据是一个字节的数据,所以变量ch存储的实际初始数值是321 MOD 256=65,即变量ch的初始数据是字符A,给读者的建议是尽量避免使用整数来替代字符数据,尽管一个字符数据就是用一个整数表示的。重重提醒:每种数据都有一个数据表示范围,数据超出了表示范围可能会产生意料之外的结果。34 处理数据的基本方式-运算C语言的优点之一是提供了丰富的运算以实现不同的数据处理的需要,同样是因为运算的丰富也为我们学习C语言带来了不便,常见的C语言的运算有以下几类:(1)算术运算 (+ - * / % + -)(2)关系运算 ( = = = !=)(3)逻辑运算 (& | !)(4)位运算 (& | )(5)

44、赋值运算 (=)(6)条件运算 (? :)(7)逗号运算 (,)(8)指针运算 (* &)(9)强制类型转换运算 ((类型))每一种运算都有一定的优先级,这里给出一个书写程序的基本建议,当有多种不同的运算出现在一个表达式中的时候,如果不能确定优先级的话,可以使用圆括号改变运算的优先顺序。在相关的章节中我们将讨论所涉及到的运算。341 算术运算及算术表达式1 基本算术运算基本算术运算有5种运算:(1)+ 加法运算(2)- 减法运算(3)* 乘法运算(4)/ 除法运算(5)% 求余数运算其中“+、-、*”三种运算与我们日常使用的习惯相一致,需要说明的是除法运算和求余数运算。对于除法运算需要注意的是

45、:当参与运算的两个数据都是整数时,运算结果也是整数。这与我们的日常习惯不同,例如5/2=2而不是2.5,5.0/2=5/2.0=5.0/2.0=2.5,只有5/2的结果是2。求余数运算m%n,需要注意的是两点:l 参与运算的两个数据必须是整数,字符数据也可以当整数对待。l 运算结果的符号与m的符号相一致。例如:17%5=2(-17)%5=-217%(-5)=2B%7=66%7=3 因为B的ASCII编码值是66求余数运算经常用在判断结构中用于判断一个数是否能被另一数除尽。需要注意的是任何一个表达式都由一个计算结果,而计算结果必定是也只能是某一种类型的数据,当参与运算的数据具有相同的数据类型时,

46、表达式计算结果自然也是这种类型的数据,但当参与运算的数据具有不同的数据类型时,表达式的计算结果也只能是一种数据类型,那么到底是那种类型的结果呢?表3-4给出了字符、基本整数和单精度实数三种类型的数据进行运算时的结果类型。表3-4 不同类型数据运算的结果类型计算结果类型备注字符与整数运算整数字符与实数运算实数不能进行%运算整数与实数运算实数不能进行%运算实际上当不同类型的数据进行运算时,计算结果类型总是那个占内存最多的数据类型,比如char类型数据占1个字节,int类型的数据占2个字节,float类型的数据占4个字节,所以实数与字符、实数数据与整数数据的运算结果都是实数类型,同理整数数据与字符数

47、据的运算结果是整数类型。当表达式中出现整数除以整数的运算时,需要特别注意整数除以整数结果是整数,例如:2/5*5=(2/5)*5=0*5=0 不是等于22/5*5.0=(2/5)*5.0=0*5.0=0.02.0/5*5=(2.0/5)*5=0.4*5=2.05/2*2=(5/2)*2=2*2=4 不是等于55/2*2.0=(5/2)*2.0=2*2.0=4.0对于整数运算需要注意的是C语言不进行越界处理,所以运算结果如果是整数的话,可能会超出整数的数值范围,这时计算结果就可能是我们意想不到的结果。例如“int a=32767;”,a+1的计算结果是多少呢?是-32768,很奇怪吧,原因是32

48、767是基本整数类型的最大整数,其二进制形式是11111,这个数加1之后变为00000,而-32768的二进制补码就是00000。设“char a=A;int b;”,b=a+1,变量b中的结果是多少?是66,因为大写字母“A”的ASCII编码是65,所以结果为66,如果“char a=255;int b;”,b=a+1,变量b中的结果是多少?256当然是个合理的解释,但这个结果是0,多么奇怪的结果,这是因为a是一个字符类型的数据,是一个一个字节的数据,255的二进制形式是,单字节数据当做整数看时,这个数就是-1,如果把a当做整数输出的话,那么输出结果就是-1,所以b=a+1的结果才是0,同样

49、的道理如果“char a=128;int b;”,b=a+1,变量b中的结果是多少?是-127,因为128的二进制形式是,这个数作为单字节整数看就是-128,所以b=a+1的结果是-127。所以字符类型的数据当做整数进行运算时务必注意这时字符数据就是一个单字节的整数。2赋值运算将一个表达式的计算结果存入一个变量时通过赋值语句来实现的:=这个语句在C语言中叶可以当做一个表达式看待,即这个赋值表达式具有两个功能:(1)赋值功能,将表达式的计算结果存入等号左侧的变量中;(2)计算出一个结果,赋值表达式的计算结果就是等号右侧表达式的计算结果,例如“int a,b;”,赋值语句“b=(a=3*7);”的

50、功能是将表达式“(a=3*7)”的计算结果存入到变量b中,表达式“(a=3*7)”是一个赋值表达式,其计算结果就是3*7的结果,即将3*7=21存入变量b中,同时赋值表达式“(a=3*7)”也将21存入了变量a中。赋值运算在C语言中是从右向左进行的,怎么理解从右向左的运算,我们先看从左向右的运算,绝大多数的运算如果优先级相同的话,那么运算的顺序是从左向右进行的,例如计算表达式“8+5-6”,又有加减运算优先级相同,所以哪个运算在前面就先算哪个,由于加法运算在前面(从左算起),所以:8+5-6=(8+5)-6=13-6=7即第一步先计算出8+5的结果13,然后再计算减法13-6=7,即8+5-6

51、相当于(8+5)-6,这时运算优先级相同时运算从左向右进行。赋值运算时从右向左进行的,即a=b=c=3*5相当于a=(b=(c=3*5),C语言中有少数的运算时从右向左的。当表达式的计算结果类型与变量的数据类型不一致时,则将将表达式的结果类型强制转换成变量的数据类型,然后存入变量之中,例如“float a=18.5;int b”,执行“b=a+1”之后变量b中存储的数据是19,因为a+1=18.5+1=19.5,强制将实数19.5转换成整数,去掉小数部分变成整数19,然后存入变量b中,强制转换不进行四舍五入的,需要注意的是实数的表示范围要远远大于整数的表示范围,不要试图将一个很大的实数(比如1

52、E8)存入一个整数变量,因为存入的结果不是你想要的结果,在计算机上试一试“a=1e5;b=a;”看一下变量b的结果是什么,肯定不是你需要的结果,试着解释你看到的结果。3混合赋值运算s=s+expr、s=s-expr、s=s*expr、s=s/expr、s=s%expr等一些类似的表达形式在书写程序的时候会经常使用,这里expr是一个表达式,例如s=s+i、s=s-i*j、s=s*(k-1)、s=s%i等,为了书写简洁,C语言允许在赋值运算的等号之前使用其他运算符号来构成混合赋值运算,例如:s+=i 相当于 s=s+is-=i*j 相当于 s=s-i*js*=i+j 相当于 s=s*(i+j)s

53、/=k 相当于 s=s/k等等,混合赋值运算的时候需要注意乘除构成的混合赋值运算的使用,例如: int a=7,b=126; b*=a+2;b*=a+2等价于b=b*(a+2)而不是b=b*a+2,b%=a+1等价于b=b%(a+1)而不是b=b%a+1。4强制类型转换在书写一个表达式的时候,任何数据只要需要都可以强制地将其转换成你所需要的数据类型,数据类型强制转换的格式是:(数据类型标识符)数据强制转换的功能是将数据强制转换成数据类型标识符所表示的数据类型,注意圆括号是必须的而且只能是圆括号,转换的数据可以是一个表达式,例如:(int)31.998=31 将31.998强制变为整数,转换规则是去掉小数部分,没有四舍五入。(float)5/2=5.0/2=2.5 转换的对象是5,不是表达式。(float)(5/2)=(float)2=2.0 转换对象是一个表达式。注意强

温馨提示

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

评论

0/150

提交评论