




已阅读5页,还剩567页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,主编 毕万新 景福文,高等职业教育 计算机类课程规划教材,大连理工大学出版社,新世纪高等职业教育教材编审委员会组编,C语言程序设计,目录,第1章 C语言概述 第2章 数据类型与表达式 第3章 顺序结构程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 数 组 第7章 函数与变量 第8章 编译预处理,第9章 指 针 第10章 结构体与共用体 第11章 文 件 第12章 C语言屏幕操作函数及应用 第13章 C语言综合实训,第1章 C语言概述,1.1 计算机语言概述 1.2 C语言的基本符号与关键字 1.3 C语言程序 1.4 C语言程序的编辑及运行,计算机的核心部件是 CPU,计算机完成的每一种操作都是在CPU的控制下完成的。CPU需要执行由人们输入的指令,才能完成一定的任务。一般情况下,CPU 能完成一系列操作,每种操作对应一条或几条指令,把计算机能执行的指令的集合称作指令系统。实际上,这些指令就是人们同计算机“交流”的语言.多数情况下,计算机所完成的任务往往需要若干条指令组合起来,形成人们称之为 “程序”的指令集合,这一过程就是程序设计,设计中使用的语言就是计算机语言。 1.1.1 计算机语言的发展概况 当代计算机在程序控制下能完成相当复杂的任务,但计算机内部所能识别的只有“0”、“1”两个二进制数。,1.1 计算机语言概述,使用机器语言编程,要求编程者精通计算机的内部结构,熟记由0和1编码形成的指令,程序设计相当困难,影响了计算机的普及与应用。 为了摆脱用机器语言编程的困难,人们研制出用助记符来代替机器语言编程,这种由助记符表示的计算机语言称为汇编语言。使用汇编语言编程,克服了机器语言难记、不易阅读等缺点,但汇编语言同机器语言一样,也是面向特定计算机的,要求编程者精通计算机的内部结构,通用性差,只适用于专业开发人员使用。 为普及计算机的应用,让计算机发挥更大的作用,人们研究开发出更易掌握、接近人类自然语言的计算机语言,这就是高级语言。用高级语言开发应用程序较机器语言和汇编语言要容易许多,效率也高。用汇编语言或高级语言编写的程序,一般称为汇编语言或高级语言源程序。,除机器语言外,使用其他语言编写的源程序,在计算机内部都必须转换成机器语言。源程序可以通过被称为编译或解释系统的“翻译”来实现这种转换。编译和解释系统是由专业开发人员设计好的系统程序,不同的高级语言有它自己的编译或解释系统。 早期使用的高级语言种类较多,如FORTRAN语言、BASIC语言、COBOL、ALGOL60等,这些语言是面向数学公式和算法的语言。20世纪70年代出现了结构化程序设计语言,如Pascal、Ada、C、Prolog等。到了20世纪80年代,计算机语言跨入了面向对象的编程阶段,出现了C+、ML、Perl等与自然语言更接近的计算机语言。20世纪90年代,出现了网络化的编程语言,如JAVA语言。计算机语言的发展,丰富了计算机的功能。 如今,无论在生活领域,还是在科学技术等领域,计算机已经显示出不可替代的作用。,1.1.2 C语言的发展历史及特点 1.C语言的发展历史简介 在计算机技术的发展过程中,开发性能卓越的操作系统是技术人员不断追求的目标。在众多的操作系统中,UNIX是成功中的典范。为描述和实现UNIX操作系统的需要,美国贝尔实验室的Ken Thompson以BCPL语言为基础,于1970年开发了B语言,并用B语言编写了UNIX操作系统。1972年至 1973年间,贝尔实验室的M.D.Ritchie在 B语言基础上设计出C语言,1973年,他和K.Thompson合作用C语言将UNIX操作系统90%以上的源代码重新改写。UNIX操作系统的一些主要特点,如可读性强、易于修改、具有良好的可移植性等,在一定程度上得益于 C语言,所以UNIX操作系统的成功与C语言是密不可分的。 目前,C语言已经能够在多种操作系统下运行,实用的C语言编译系统种类较多,如Microsoft C、Turbo C等。,2.C语言的特点 (1)C语言基本组成部分紧凑简洁。C语言只有 32个标准关键字、44个标准运算符以及 9种控制语句,不但语言的组成精练、简洁,而且使用方便、灵活。 (2)C语言运算符丰富,表达能力强。C语言具有“高级语言”和“低级语言”的双重特点,运算符包含的内容广泛,所生成的表达式简练、灵活,有利于提高编译效率和目标代码的质量. (3)C语言数据结构丰富,结构化好。C语言提供了编写结构化程序所需要的各种数据结构和控制结构,这些丰富的数据和控制结构以及以函数调用为主的程序设计风格,保证了 C语言程序具有良好的结构化特征。 (4)具有结构化的控制语句。如ifelse语句.while语句. do while语句.switch语句.for语句。用函数作为程序模块以实现程序的模块化,是结构化的理想语言,符合现代编程风格。,(5)C语言提供了某些接近汇编语言的功能,有利于编写系统软件。C 语言提供的一些运算和操作,能够实现汇编语言的一些功能,如它可以直接访问物理地址,并能进行二进制位运算等,这为编写系统软件提供了条件。 (6)C语言程序所生成的目标代码质量高。C语言程序所生成的目标代码效率比用汇编语言描述同一个问题高20%左右。 (7)C语言程序可移植性好。C语言所提供的语句中,没有直接依赖于硬件的语句,与硬件有关的操作,如数据的输入、输出等都是通过调用系统的库函数来实现的,而库函数本身不是C语言的组成部分。因此用C语言编写的程序可很容易地从一种计算机环境移植到另一种计算机环境中。 C语言的弱点: 一是运算符的优先级较复杂,不容易记忆;,二是由于C语言的语法限制不太严格,在增强程序设计灵活性的同时,某种程度上也降低了程序的安全性,因此对程序设计人员也提出了更高的要求。 1.2.1 基本符号集 字符集是构成C语言的基本元素。用C语言编写程序时,除字符型数据外,其他所有成份必须由字符集中的字符构成。 C语言的字符集由下列字符构成: (1)英文字母:AZ,az。 (2)数字字符:09。 (3)特殊符号:,1.2 C语言的基本符号与关键字,空格 ! % * . , () 1.2.2 关键字 关键字是C语言已经定义的、具有特殊功能和含义的单词、单词缩写或者单词组合。以下列出的是C语言的关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigned union void volatile while,1.2.3 标识符 标识符用于给变量、函数和其他用户自定义类型命名。C 语言的标识符必须按以下规则构成: (1)必须以英文字母或下划线开始,并由字母、数字和下划线组成。例如:chABC,intX,uY126 等都是合法的标识符,而555Str,-chabc,+intJ等则是非法的标识符。 (2)每个标识符可以由多个字符组成,但只有前 8个标识符为有效标识符,例如:employee1和employee2 被认为是相同的标识符employee。 (3)大写字符和小写字符代表不同的标识符,如chabc和chABC是两个不同的标识符。 (4)不能使用C语言的关键字作为标识符。,1.2.4 ASCII字符集 在计算机中,所有的信息都用二进制代码表示。二进制编码的方式较多,应用最为广泛的是 ASCII码。我们使用的字符在计算机中就是以ASCII码方式存储的。 ASCII码是美国标准信息交换码(American Standard Code for Information Interchange,缩写为ASCII)。它已被国际标准化组织(ISO)认定为国际标准,详见附录3。 ASCII码分为标准ASCII码和扩展ASCII码,标准ASCII码在内存中占用一个字节,字节中的低 7位用于编码,因此可以表示128个符号。 基本字符如09,AZ,az等编码值为 32127,控制符的编码值为 031。控制符用于计算机向外部设备输出一些特殊的命令,如控制打印机换行、换页等。,1.3.1 源程序的书写格式 下面以一个简单的例子,说明C语言源程序的书写格式。 例1.1 在计算机屏幕上输出I am a C programmer,I like C!。 /* 程序名称:simple.c */ /* Writen by jinghui zhao */ main() /* 主函数 */ printf(I am a C programmer,I like C!); /* 输出被显示的内容 */ ,1.3 C语言程序,例1.1是一个最简单的C源程序。其中main()是主函数,main是函数的名称。用括起来的内容是函数体,函数体应由若干条语句组成,这是计算机要执行的部分,每条语句以分号“;”结束。/*/之间的内容是语句的注释部分,供阅读程序之用。计算机并不执行注释部分的内容,编程时,为了使程序易读,应养成加注释的习惯。 例1.2 从键盘上输入两个整数,计算它们的和并显示结果. /* 程序名称:ex1-2.c */ /* Writen by jinghui zhao */ main() int i,j,result; /* 定义整型变量i,j,result */ printf(Please input i and j:); /* 输入提示信息 */,scanf(%d,%d, /* 返回x,y之和 */ ,同例1.1相比,例1.2除含有main()函数外,增加了函数sum(int x,int y),整个程序由主函数和函数sum(int x,int y)构成。需要说明的是,main() 函数是程序执行的入口点,无论程序包含多少个函数,程序都从main()开始执行. 1.3.2 C语言程序结构特点 (1)C 语言程序是由函数构成的,一个源程序可以包含若干个函数,但必须有且只有一个函数为主函数main()。 (2)由大括号括起来的部分为函数体,函数体可以包含若干条C语句。每条语句必须以分号“;”结束。 (3)除主函数外,C 语言系统还提供一些可直接使用的库函数,如例子中的 printf()、scanf()等。用户也可以根据需要,自己定义函数如sum()。 (4)程序可以加注释以增加可读性,其内容必须用/*.*/括起来。,(5)C语句一般用小写字母书写。 C语言是编译执行的高级语言,用C编写的源程序必须经编译、连接生成相应的二进制代码后,才能被执行。C 程序的编辑、编译、连接等过程可以在现成的集成开发环境下完成。常用的开发环境有:UNIX和DOS操作系统下的MSC4.0、Turbo C,其中Tur-bo C是最流行、使用最方便的开发环境,Turbo C开发环境详见附录1。 1.4.1 Turbo C环境下编辑与运行C程序的步骤 1.C程序的上机步骤,1.4 C语言程序的编辑及运行,(1)编辑。在Turbo C环境下,将C语言源程序通过键盘输入到计算机中,并以文件形式存盘,以便将来再使用时,直接从磁盘调入到内存中执行,文件扩展名为.c,例如ex1.c。 (2)编译。编译过程将把 C语言源程序转换成目标程序。目标程序是以.obj为扩展名的文件。若源程序有错,需要对其进行修改,然后重新编译直至没有错误,才算编译成功。 (3)连接。编译后生成的目标文件不能直接执行,需要经过连接之后才能生成可执行代码。在 DOS系统下,连接后所得到的可执行文件扩展名是.EXE。连接的目的是将目标文件和库函数或其他目标程序连接成可执行程序。 (4)执行。连接生成的程序就是可执行文件了。在 DOS系统下,只要键入可执行文件名,如ex1,再按回车键就可以了。 综上所述,上机步骤为: 编辑(.C)编译(.OBJ)连接(.EXE)执行.,2.Turbo C环境介绍 Turbo C是一个快速、高效的编译软件,它将程序的编辑、编译、连接和执行集成在一起,形成一个集成开发环境。在Turbo C 的集成环境下,编程和调试等功能均可以通过菜单来完成。 Turbo C2.0系统是DOS环境下的应用软件。只要在DOS系统下进入Turbo C2.0 所在的目录,输入TC并回车后,即进人Turbo C2.0集成环境。按任意键,版本信息消失,屏幕显示如图1.1所示。,图1.1 Turbo C2.0集成开发环境,Turbo C2.0集成开发环境的主屏幕,由上至下分成四部分:主菜单、编辑窗口、编译信息窗口和功能键提示行。 一般情况下,光标停留在主菜单的File项上,可以通过键盘上的光标移动键移动光标。要选择执行哪项功能,可以将光标移动到哪一项上,如Edit,然后回车,便执行该项的功能。如果在启动tc时,已经键入了源程序的文件名(如执行tc.exe.),则光标直接处在编辑窗口的左上角,此时,可以直接键入源程序。否则,如果光标处在主菜单上,需要利用光标移动键移动光标至Edit项上,回车,光标回到编辑窗口的编辑区时,才能输入程序。 源程序编辑完成后,先按F2键保存源程序,然后用功能键F10激活主菜单(使光标回到主菜单),利用光标移动键依次移动光标到编译(Compile)、连接(Link)、运行(Run)的菜单项上,按回车键,即可执行相应的功能。,1.4.2 程序调试方法 程序设计过程中难免出错。设计完成的计算机程序必须经过测试来确定其是否可以正确地工作,这一过程称为调试。 程序错误一般有两类:一类是语法错误;另一类是运行错误. 语法错误是由于没有按照程序设计语言的语法规则编写语句所致,一般通过编译和连接就会找到,可根据编译系统给出的提示进行修改,直至编译通过,说明程序没有语法错误。 运行错误往往是由于编程者所采用的变量类型或(部分或全部)算法有问题,而导致开始或中间结果不正确。 1.设置和使用观察变量 找出程序运行错误的一种有效方法是设法了解程序执行过程中某些变量或表达式值的变化,Turbo C集成环境提供了观察变量的途径。,选Break/Watch菜单项中的Add watch项或同时按Ctrl+F7键,会出现一个输入框,输入欲观察的变量名或表达式后,它们就会出现在watch(屏幕底部)窗口中。 重复使用 Break.Watch菜单项中的 Add watch项或同时按Ctrl+F7键可以在Watch窗口添加多个变量或表达式。变量或表达式设置完成后,执行程序。Watch 窗口中变量或表达式的值随程序的执行将发生变化,由于程序执行速度非常快,往往观察不到这种变化。因此,需要使程序在人为地控制下逐条地执行语句,以观察变量或表达式的值。这可以通过单步执行程序、设置和使用断点来实现。 2.单步执行程序 选Run菜单中的Step over命令项或按F8键,亮条就出现在主函数处,说明程序从主函数开始执行。每次选Run菜单中的Step over命令项或按一次F8键则执行一行程序,遇到函数时不进入函数(定义),即将函数作为一条语句或一个表达式处理.,执行Run菜单中的Trace into命令项或按F7键也是跟踪执行程序,与单步不同的是遇到函数时进入其内部逐行执行。 执行Run菜单中的Goto cursor命令项或按F4键,从主函数开始执行程序到光标所在处(跟踪到光标)。欲让程序在某条语句暂停,只需将光标移到那条语句所在行,选 Run菜单中的Goto cursor命令项或按 F4键,程序即可暂停在光标所在行。 然后再移动光标到欲暂停的语句行上,再选 Run菜单中的Goto cursor命令项或按F4键,由此可以方便地调试程序。 3.设置和使用断点 通过设置断点,可以分段解决问题,把出现问题的范围缩小。调试程序时,可以在程序中设置多个断点。当程序执行到断点时,就会在有断点的那行上暂停程序的执行,显示所需观察变量或表达式的当前值,据此可判定断点前的程序是否有问题。设置断点的步骤为:,(1)在编辑窗口将光标移到欲设置断点的那一行上; (2)选Break.Watch菜单项中的Toggle breakpoint命令项或同时按Ctrl+F8键,被设置断点的一行呈高亮度显示; (3)欲设多个断点,重复步骤(1)、(2),断点所在的行均呈高亮度显示; (4)要删除断点,将光标移到欲删除断点所在行,选Break/Watch菜单项中的Togg-lebreakpoint命令项或同时按Ctrl+F8键。 以上方法可结合使用。程序连续执行时,一遇到断点就会暂时停止,并返回编辑状态。断点不会因为被执行而清除。 程序的调试技巧和程序设计一样重要。在调试过程中可以积累编程经验和技巧,为设计优秀的程序奠定基础。,第2章 数据类型与表达式,2.1 常量和变量 2.2 整型数据 2.3 实型数据 2.4 字符型数据 2.5 变量赋值 2.6 运算符及表达式 2.7 数据类型转换,任何程序都涉及到待处理的数据,数据可以是常量和变量. C 语言可以处理的数据类型很多,可分为基本类型、复杂类型,如图2.1所示。本章将讨论C语言的变量和常量、基本数据类型、运算符和表达式以及不同数据类型之间的转换等。,图2.1 数据类型,数据类型,基本类型,复杂类型,整型类型,浮点数类型,字符型类型,单精度型,双精度型,构造类型,指针类型,枚举类型,自定义类型,数组类型,结构体类型,共用体类型,2.1.1 常量 常量又称常数,是指在程序运行中其值不能被改变的量。 常量可分为不同的类型:如 5、0、-8为整型常量; 2.5、-1.2为实型常量; a、b为字符型常量,也可以用一个名字(字符序列)来代表一个常量,如用PI表示3.14,这种常量被称为符号常量。符号常量的使用将在第 8章介绍;还可以用与某些字母组合,表示能够让计算机运行时完成一固定动作的字符常量称转义字符常量。,2.1 常量和变量,2.1.2 变量 变量是指在程序运行过程中其值可以被改变的量。 变量被分为不同类型,在内存中占用不同的存储单元,以便用来存放相应变量的值,编程时,用变量名来标识变量,变量的命名规则同第1章中标识符的定义规则相同。 1.变量的有关规定 (1)使用变量前,必须先定义,否则不能作为变量来使用. 例如: int student;statent=20; 在编译时检查出statent未经定义。 (2)每一个变量属于一种类型,便于在编译时为其分配相应的存储单元并据此检查该变量所进行的运算是否合法。 合法的变量名:day,year,book,student,a1,a2,b1,b2 不合法的变量名:#852,.com,s1,1999y,123,float,2.变量的定义 存储属性 数据类型 变量名表 变量定义包括三部分:存储属性、数据类型、变量名表。 数据类型决定了变量的取值范围和占用内存空间的字节数,变量名表是具有同一数据类型变量的集合。 2.2.1 整型常量 整型常量有三种表示方法: (1)十进制整数:如1236,-234,0。 (2)八进制整数:以0开头的数是八进制数。如 011表示八进制数的(11)8 。,2.2 整型数据,(3)十六进制整数:以0x开头的数是十六进制数。 如0x123即(123)16 。 例2.1 三种进制表示方法的转换。 源程序a1.c main() int x=1246,y=01246,z=0x1246; printf(%d,%d,%dn,x,y,z); /*%d: 以十进制格式符输出 */ printf(%o,%o,%on,x,y,z); /*%o: 以八进制格式符输出 */ printf(%x,%x,%xn,x,y,z); /*%x: 以十六进制格式符输出 */ ,C:a1 1246,678,4678 2336,1246,11106 4de,2a6,1246 2.2.2 整型变量 整型变量可用来存放整型数据(即不带小数点的数)。整型变量可以分为:基本型、短整型、长整型和无符号整型4种类型,其定义的关键字如下: (1)基本型:用int表示; (2)短整型:用short int或short表示; (3)长整型:用long int或long表示; (4)无符号整型: 无符号整型: 用unsigned int或unsigned表示;,无符号短整型: 用unsigned short int或unsigned short表示; 无符号长整型: 用unsigned long int或unsigned long表示。 无符号整型变量在存储单元中的全部二进制位都用来存放数据本身,而没有符号位,即不能存放负数,一个无符号整型变量刚好是其有符号数表示范围的上下界绝对值之和。 例如:一个整型变量在内存中占两个字节(16bit),则int型变量数值的表示范围是-3276832767,unsigned int 变量数值的表示范围为065535。 C语言标准没有具体规定以上各类数据所占内存的字节数,各种编译系统在处理上有所不同。 一般的原则是:,以一个机器字(word)存放一个int 型数据,而long整型数据的字节数应不小于int型,而short型应不长于int型。 以PC机为例,整型变量数值的表示范围如表2.1所示。 2.2.3 整型变量的使用 不同的整型数据,应根据其特性和取值范围,将其定义成不同类型的整型变量。,整型数据类型 所占位数 所占字节数 数的表示范围 int 16 2 -3276832767,即-2152 5-1 short int 16 2 -3276832767,即-215215-1 long int 32 4 -21474836482147483647,即-231231-1 unsigned int 16 2 065535,即0216-1 unsigned short 16 2 065535,即0216-1 unsigned long 32 4 04294967295,即0232-1,表2.1 整型变量数值取值范围,如果一个整型数据取值在 -32768到32767之间,应该定义为int 整型数据。对于不可能有负值的整型数据,应该定义为unsigned int。当整型数据的取值可能超出-32768或0到65535的范围时,应定义为long int型或unsigned long型。 例如:下面几个变量的定义。 平均年龄a1:0150 学生人数a2:020000 磁盘的字节数a3:02 16 int a1; /* 定义为整型变量 */ unsigned int a2; /* 定义为无符号整型变量 */ unsigned long int a3; /* 定义为无符号长整型变量 */ 例2.2 不同类型的数据进行算术运算。 源程序a2.c,main() int a,b,s1,s2; /* 定义名为a,b,s1,s2的整型变量 */ unsigned x; /* 定义名为x的无符号整型变量 */ a=10;b=-30;x=20; s1=a+x;s2=b+x; printf(a+x=%d,b+x=%dn,s1,s2); C:a2 运行结果为 a+x=30,b+x=-10,从本例可以看出,不同类型的数据可以进行算术运算。在本例中是int型数据与unsigned int型数据进行相加和相减运算. 例2.3 整型数据各类型所能表示的范围。 源程序a3.c main() int a,b; /* 定义整型变量a,b */ long c,d; /* 定义长整型变量c,d */ unsigned e,f; /* 定义无符号整型变量e,f */ a=32767;b=1; c=2147483647;d=1; e=65535;f=1;,printf(int: %d,%d,n,a,a+b); /*%d: 以十进制的格式输出 */ printf(long: %ld,%ldn,c,c+d); /*%ld: 以长整型的格式输出 */ printf(unsigned: %u,%un,e,e+f); /*%u: 以无符号整型的格式输出 */ C:a3 运行结果为 int: 32767,-32768 long: 2147483647,-2147483648 unsigned: 65535,0 从运行结果可以看出,当各种整型数取最大值时,如果再加1,则超出其所能表示的范围,变成该类型取值范围的最小值.,2.3.1 实型常量 在C语言中,把带小数的数称为实数或浮点数。 1.十进制数形式 它是由数字和小数点组成,如3.14159,-7.2,8.9等都是十进制形式。 2.指数法形式 如:180000.0用指数法可以表示为1.8e5,1.8称为尾数,5称为指数。 0.00123用指数法可以表示为1.23E-3。 注意: (1)字母e或E之前(即尾数部分)必须有数字。,2.3 实型数据,(2)e或E后面的指数部分必须是整数。 如:e-3,9.8e3.1,e5都是不合法的。 2.3.2 实型变量 实型变量又称为浮点型变量,按能够表示数的精度,又分为单精度浮点型变量和双精度浮点型变量,定义方式分别如下: float a,b; /* 单精度变量的定义 */ double c,d; /* 双精度变量的定义 */ 单精度浮点型变量和双精度浮点型变量之间的差异,仅仅体现在所能表示的数的精度上。一般系统单精度型数据占 4个字节,有效位为7位,数值范围约为10-38 1038 ,而双精度型数据占8个字节,有效位为1516位,数值范围约为1030810 308. 实型常量不存在单精度型和双精度型之分。当一个实型常量赋予一个实型变量时,C语言根据该实型变量的类型来截取常量中相应的有效位数字。,2.4.1 字符型常量 字符型常量是由一对单引号括起来的单个字符构成,例如, A,b,2,%,;等都是有效的字符型常量。一个字符型常量的值是该字符集中对应的编码值,例如在ASCII字符集中,字符常量09的ASCII编码值是4857。显然0与数字0是不同的。 C语言中还允许用一种特殊形式的字符常量,即以反斜杠字符开头的字符序列。前面用的printf()函数中的n,代表一个“回车换行”符。这类字符称为“换码序列”,或“转义字符”,意思是将反斜杠“”后面的字符转换成另外的意义。换码序列见表2.2。,2.4 字符型数据,例如: main() printf(abct derftgn); 运行结果: f gde,换码序列 意 义 换码序列 意 义 n 回车换行 r 回车,将当前位置移到本行开头 b 左退一格 t 横向跳格字符(即跳到下一个输出区) f 换页 0 空值(NULL) 单引号 双引号 v 竖向跳格 ddd 1至3位八进制数所代表的字符 反斜线 xhh 1至2位十六进制数所代表的字符,表2.2 换码序列表,2.4.2 字符型变量 一个字符型变量用来存放一个字符,在内存中占一个字节.实际上,将一个字符常数赋给一个字符变量,并不是把该字符本身放到内存单元中去,而是将该字符的 ASCII代码放到内存单元中,因此,字符型数据也可以像整型数据那样使用,可以用来表示一些特定范围内的整数。 字符型数据可分为两类: 一般字符类型(char)和无符号字符类型(unsigned char),运行在 PC及其兼容机上的字符数据的字节长度和取值范围如表2.3所示。 注意:一个字符型变量只能存放一个字符,不能存放一个字符串。,表2.3 字符数据的字节长度和取值范围,数据类型 字节长度 取值范围 char 1 -128127的整数 unsigned char 1 0255的整数,字符型数据与整型数据可以通用,且字符型数据可以进行算术运算。 例2.4 字符型数据与整型数据可以通用。 源程序a4.c main() char c1,c2; /* 定义名为c1,c2的字符型变量 */ c1=65;c2=66; /*将字符ASCII码值65、66分别赋给c1,c2*/ printf(%c,%cn,c1,c2); /* 输出c1,c2对应的字符 */ printf(%d,%dn,c1,c2); /* 输出c1,c2对应字符的ASCII码值 */ ,C:a4 运行结果为 A,B 65,66 例2.5 字符型数据可以进行算术运算。 源程序a5.c main() char c1,c2; /* 定义名为c1,c2的字符型变量 */ c1=A;c2=B; /* 将字符A、B分别赋给c1,c2 */ c1=c1+32;c2=c2+32; /* 将c1,c2的ASCII码分别加32 */ printf(%c,%cn,c1,c2); printf(%d,%dn,c1,c2);, C:a5 运行结果为 a,b 97,98 2.4.3 字符串常量 字符串常量是由一对双引号括起来的字符序列,例如program,A,book都是字符串常量,双引号仅起定界符的作用,并不是字符串中的字符。字符串常量中不能直接包括单引号、双引号和反斜杠“”,若要使用,可参照换码序列中介绍的方法。 字符串常量与字符常量的区别: (1)字符串常量是用双引号括起来的字符序列; (2)字符串常量在内存中存储时有串尾标记“0”;,(3)字符串常量允许扩展表示法; (4)C 语言中没有专门的字符串变量。字符串如果需要存放在变量中,需要用字符型数组来存放。 注意:不要将单个字符组成的字符串常量与字符常量混淆。a为字符常量,而a为字符串常量,不能把一个字符串常量赋给一个字符变量。例如下面的用法都是错误的: char c1,c2; c1=a; c2=CHINA; 对于字符串,C 语言中规定以字符0作为结束标志,系统将根据该字符判断字符串是否结束。字符0由系统自动加入到每个字符串的结束处,不必由编程人员加入。因此,对于字符串CHINA,它在内存中实际存放形式如图2.2所示,其长度是 6个字节,而不是 5个字节。字符 0所对应的ASCII值为0,即“空”字符。,为变量赋值有两种方式:一是变量初始化,即在定义变量的同时给变量赋予初值。另一种方式是采用先说明变量的类型,然后在执行语句体中再赋值给变量。 1.先定义后赋值 int a,b,c; char d; float f; a=2;,图2.2 字符串的存储形式,2.5 变量赋值,b=5; c=10; d=a; f=5.7; 2.定义和赋值同时进行 int a=5; short b=10; char c=a; float d=7.8; 3.对几个变量同时赋一个初值 int a1=10,a2=10,a3=10; 初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋以初值的。相当于一个赋值语句。例如: int a=10;,相当于: int a; a=10; 又如: int a,b,c=20; 相当于: int a,b,c; c=20; C语言的运算符非常丰富,使用方法也非常灵活,这是C语言的主要特点。C语言具有 44种运算符,其中一部分与其他高级语言相同,而另外一部分与汇编语言相似。,2.6 运算符及表达式,运算符与运算对象(常量、变量、函数、表达式)组合起来,构成不同类型的表达式。C 语言的运算符有不同的优先级和结合方向规则。如附录所示,优先级是按由高到低的顺序排列的。 C 语言运算符可以分为: 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等几类; 若从其在表达式中与运算对象的关系上分,可分为单目运算符、双目运算符和三目运算符。 2.6.1 算术运算符和算术表达式 1.算术运算符 算术运算符有加,减,乘,除及取模5种,分别由: + , -, *, /, % 来表示。 C语言规定: (1)取模运算符%,仅用于整型变量或整型常量,例如: 5%3,其值为2。,(2)优先级: 一个表达式中如有多个运算符,则计算的先后次序为相应运算符的优先级高的优先。乘、除、取模优先级高于加、减的优先级,即先乘、除、取模,后加、减。 (3)结合方向: 是当一个运算对象两侧的运算符的优先级别相同时,应遵循的处理规则,即进行运算(处理)的结合方向。算术运算符的结合方向是从左至右; 赋值运算符的结合方向是从右至左。 2.算术表达式 由算术运算符、括号以及操作对象组成的符合C语言语法规则的表达式称为算术表达式。例如下述式子均为算术表达式: a+b*c+(x/y)-700 100%3+100*2 2.6.2 赋值运算符和赋值表达式 1.赋值运算符,C语言的赋值运算符是“=”,它的作用是将赋值运算符右边表达式的值赋给其左边的变量。 例如:a=10;x=a+5;前者是把常量 10赋给变量a,后者是将表达式a+5的值赋给变量x。 注意:如果“=”两侧的类型不一致,在赋值时要进行类型转换。例如:a=b;执行该语句时,b 的结果转换为a的类型后才能进行赋值运算。 2.复合赋值运算符 C语言允许在赋值运算符“=”之前加上其他运算符,以构成其复合运算符。复合运算符多数为双目。在 C语言中,可以使用的复合赋值运算符有: + =,- =,* =,/ =,% =, =,& =,=, = a+=2 等价于 a=a+2 x*=y+5 等价于 x=x*(y+5),x%=8 等价于 x=x%8 赋值运算符都是自右向左执行的。C语言采用复合运算符,一是为了简化程序,使程序精练,二是为了提高编译效率。 3.赋值表达式 赋值表达式的一般形式为 变量赋值运算符表达式 它的功能是将赋值运算符右边的“表达式”的值赋给左边的变量。注:赋值表达式左边必须为变量,例如: 下面的表达式均为赋值表达式。 b=4,b的值为4。 e=f=-2 等价于 e=(f=-2),其值为-2。 a=(10+20)%8/3 的值为2。 x=(y=10)/(d=2)的值为5。,赋值表达式也可以包含复合的赋值运算符,例如: 如果a=10,表达式a+=a-=a*a的值为-180。其求解步骤为: (1)先进行a-=a*a的计算, 它相当于a=a-a*a=10-10*10=-90。 (2)再进行a+=-90的计算, 它相当于a=a+(-90)=-90-90=-180。 4.自增自减运算符 增1运算符(+)和减1运算符(-)是 C语言中两个较为独特的单目运算符。它既可以在操作数前,也可以在操作数后,其操作对象只能是变量,不能是常量或表达式。 自增自减运算符的作用是将操作对象的值增加1或减去1。 虽然自增自减运算符既可用于前缀运算,也可用于后缀运算,但其意义不同。例如:,i+,i- 表示在使用i值之后将i值加(减)1 +i,-I 表示在使用i值之前将i值加(减)1 若i=5,则: x=+i; i=i+1=5+1=6,x=i=6 x=i+; x=i=5,i=i+1=5+1=6 例如:i=2,则: j=+i; i的值先变为3,再赋给j,j的值为3 j=i+; 先将i的值2赋给j,j的值为2,然后i变为3 j=-i; i的值先变为1,再赋给j,j的值为1 j=i-; 先将i的值2赋给j,j的值为2,然后i变为1 若i=3,则: (i+)+(i+)+(i+)=9,相当于3+3+3=9; (+i)+(+i)+(+i)=18,相当于6+6+6=18。,说明: (1)+和-仅适用于变量,不能用于常量或表达式。 (2)+和-运算符的结合方向是“自右向左”。 例如: main() int a=100; printf(a+=%dn,a+); printf(+a=%dn,+a); printf(a-=%dn,a-); printf(-a=%dn,-a); 输出结果:,a+=100 +a=102 a-=102 -a=100 2.6.3 关系运算符和关系表达式 1.关系运算符 关系运算符均为二目运算符,共有以下6种: 大于 = 大于等于 = 小于等于 = 等于 != 不等于,关系运算符要求两个操作数是同一种数据类型,其结果为一逻辑值,即关系成立时,其值为真(true),用非0值表示;关系不成立时,其值为假(false),用0表示。 关系运算符的优先级低于算术运算符,关系运算符=和!=低于前四种运算符,并且结合方向均为自左至右。 2.关系表达式 由关系运算符将两个表达式连接起来的有意义的式子称为关系表达式。 xy,a+b100为合法的关系表达式 例如:a+bc-6 先进行a+b和c-6两个算术表达式的运算,得到两个值后再进行比较,从而求出关系表达式的值。由关系运算符和其运算对象组成的表达式称为关系表达式,其值为0或非0。 关系表达式的值是一个逻辑值,即“真”或“假”。,在C语言中,常用1表示“真”,用0表示“假”。例如:当xy为“真”时,其表达式的值为1;当xy为“假”时,其表达式的值为0。 可以将关系表达式的运算结果(0或1)赋给一个整型变量或字符型变量,如:a=4,b=1,下面的赋值语句将1赋给变量c: c=ab;c的值为1; 若a=1,b=8,x=ab;x的值为0。 2.6.4 逻辑运算符和逻辑表达式 1.逻辑运算符 逻辑运算符有“ “!”为单目运算符,仅对其右边的对象进行逻辑求反运算。逻辑运算符中的“&”和“ ”低于关系运算符,“!”高于算术运算符。如图2.3所示。,!(非) (高) 算术运算符 关系运算符 &和 赋值运算符 (低),图2.3 各种运算的优先级,逻辑运算符的操作对象为零或非零整数值,其运算规则见表2.4.,表2.4 逻辑运算规则,数据a 数据b a&b a b !a !b T T T T F F T F F T F T F T F T T F F F F F T T,2.逻辑表达式 由逻辑运算符和其操作对象组成的表达式称为逻辑表达式。,例如: a&b,!c,(a+b)&(c。这些运算符除外,均为二目运算符,即要求运算符的两侧各有一个运算量,且运算量只能是整型或字符型。 1.按位与(&) 操作规则: 参加运算的两个运算量,如果两个相应的位均为1,则该位的结果为1,否则为0,见表2.5。,表2.5 按位与,运算量1 0 1 0 1 运算量2 0 0 1 1 结果 0 0 0 1,例如:(1) (2) (3) (4) 01000001 01000001 01000001 01000001 & 01000010 & 00000000 & 11111111 & 10001110 01000000 00000000 01000001 00000000 例如: 按位与的主要用途为: (1)清零。要将一个运算量的每个位清为零, 即00000000,只要找一个运算量,其中相应于原量为1的每位均为0,则这两个运算量按位与的结果为00000000。 (2)取一个数中的某些位。如要取一个整数中的低字节,只要将它与255, 即十六进制的00FF、二进制的0000000011111111按位与即可。如: 00101101 10011100 & 00000000 11111111 00000000 10011100,这样就将其高字节清零了。 若要取其中的高字节,可将其与65280,即十六进制的FF00、二进制的1111111100000000按位与即可。如: 00101101 10011100 & 11111111 00000000 0101101 00000000 2.按位或( ) 操作规则:参加运算的两个运算量,其相应的位中只要有一个为1,则该位的结果为1,否则为0,见表2.6。,运算量1 0 1 0 1 运算量2 0 0 1 1 结果 0 1 1 1,表2.6 按位或,例如: (1) (2) (3) (4) 01000001 01000001 01000011 01000001 00101001 00000000 11111111 10111110 01101001 01000001 11111111 11111111 按位或常用来对一个数的某些位置为1。一个整数a,要将其低字节全置为1,即低字节为11111111,可将该数与255(十六进制为FF,二进制为11111111)按位或即可。如: 00110010 01001010 00000000 11111111 00110010 11111111 3.按位异或() 操作规则:参加运算的两个运算量,当相应位相同时,其结果在该位为0,相应位不同时,其结果在该位为1,即按位相加,但不进位,见表2.7。,例如: (1) (2) (3) (4) 01000011 01000011 01000011 01000011 00100101 00000000 11111111 01000011 01100110 01000011 10111100 00000000 按位异或的主要用途为: (1)使指定位翻转。即由1变为0,由0变为1。 如:要对011100110的低4位翻转,将其与00001111按位异或即可。 01100110
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护士证试题及答案
- 2025年防城港市金湾小学招聘教师考试笔试试题(含答案)
- 煤炭资源勘探开发合同
- 北京消防安全知识培训课件
- 护理相关知识考核试题及答案
- 2025上半年教资作文真题幼儿园含答案
- 2025《药品网络销售监督管理办法》考核题(含答案)
- 2006年7月国开电大法律事务专科《刑法学(2)》期末纸质考试试题及答案
- 2025年【G1工业锅炉司炉】作业考试题库及G1工业锅炉司炉考试试题(含答案)
- 北京地铁消防知识培训课件
- 城市发展史起源演变和前景概述课件
- 麻醉术后护理业务学习
- 人教版高二语文必修四《中华文化精神》教学设计
- 初中数学-综合与实践 哪一款“套餐”更合适教学课件设计
- 采油采气井控题库
- Cpk 计算标准模板
- 精选浙江省普通高中生物学科教学指导意见(2023版)
- “魅力之光”核电知识竞赛试题答案(二)(110道)
- 外科学课件:食管癌
- 汽机专业设备运行日常点检
- GB/T 2820.12-2002往复式内燃机驱动的交流发电机组第12部分:对安全装置的应急供电
评论
0/150
提交评论