C语言程序设计教程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-03 04:47:37

点击下载

作者:陈家俊、符茂胜

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

C语言程序设计教程

C语言程序设计教程试读:

开始

流行。现在,面向对象的程序设计语言已成为程序设计的主流语言之一。由C语言发展出来的C++就是一种非常优秀的面向对象的程序设计语言。Java是比较纯的面向对象的语言,它的绝大多数程序实体都是对象,利用对象的封装性可以大大降低网络上程序交换的复杂性。最后,Java是一种更安全的语言,它消除了C和C++中众多的不安全因素(Java为了追求语言简单性和安全性,把C程序员推崇备至的指针也取消了),提供了诸多安全保障机制,例如异常处理、代码检查等,比其他语言更适合网络应用软件的开发。

在面向对象编程中,程序被看成是相互协作的对象集合,每个对象都是某个类的实例,所有的类构成一个通过继承关系相联系的层次结构。面向对象的程序设计语言具有对象生成功能、消息传递机制以及类和继承机制。

对象是对客观事物的抽象,面向对象的编程,就是针对客观的事物设计程序。因此,面向对象的编程是非常直观的。面向对象的程序设计方法比面向过程的程序设计方法更清晰,更适合于开发大型复杂的软件。1.2 认识C语言

为了更好地学习这门语言,让我们先来了解一下它的发展状况。1.2.1 C语言的发展过程

C语言最早的原型是ALGOL 60,1963年,剑桥大学将其发展成为CPL(Combined Programing Language)。1967年,剑桥大学的Matin Richards对CPL语言进行了简化,产生了BCPL语言。1970年,美国贝尔实验室(Bell Labs)的Ken Thompson将BCPL进行了修改,并取名叫做B语言,意思是提取CPL的精华(Boiling CPL down to its basic good features)。并用B语言写了第一个UNIX系统。1973年,AT&T贝尔实验室的Dennis Ritchie(D.M.RITCHIE)在BCPL和B语言的基础上设计出了一种新的语言,取BCPL中的第二个字母为名,这就是大名鼎鼎的C语言。随后不久,UNIX的内核(Kernel)和应用程序全部用C语言改写,从此,C语言成为UNIX环境下使用最广泛的主流编程语言。1978年,Dennis Ritchie和Brian Kernighan合作推出了《The C Programming Language》的第一版(按照惯例,经典著作一定有简称,该著作简称为K&R),书末的参考指南(Reference Manual)一节给出了当时C语言的完整定义,成为那时C语言事实上的标准,人们称之为K&R C。从这一年以后,C语言被移植到了各种机型上,并受到了广泛的支持,使C语言在当时的软件开发中几乎一统天下。1989年正式修订后成为大家公认的标准,称为89ANSI C。该标准中规定了C语言的关键字为28个,1999年在原89ANSI C基础上增加了新的面向对象特性,并增加了4个关键字,该标准即为现在的99ANSI C。

不同的编译器开发商在遵照C语言标准的基础上,对标准C新增了一些特性,如增加了图形图像处理能力,或在标准C的基础上,增加了特定的库函数。编译器的实现方式不同,这样市面上出现了Borland公司的Turbo C,Microsoft公司的Microsoft C等不同的编译器,都可实现对C语言程序的编辑、编译、连接和运行。Microsoft C增加面向对象特性后,发展为Microsoft C++和可视化编程的Microsoft Visual C++。本书就是以Microsoft Visual C++为开发环境进行介绍的。1.2.2 C语言的特点(1)C语言是一种结构化语言,层次清晰,便于按模块化方式组织程序,易于调试和维护。(2)C语言的表现能力和处理能力极强。不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,它还可以直接访问内存的物理地址,进行位级别的操作。(3)由于C语言实现了对硬件的编程操作,所以既可用于系统软件的开发,也适合于应用软件的开发。C语言还具有效率高、可移植性强等特点。因此广泛地移植到了各类计算机上,从而形成了多种版本的C语言。(4)由于C语言允许直接对位、字节和地址进行操作,能实现汇编语言的大部分功能。(5)目标代码质量高,程序执行效率高。

总体来说,C语言的优点是简洁、紧凑、使用方便、灵活、易于学习和应用,程序的书写形式也很自由。C语言的缺点是语法限制不严格,使得编程者无法过多地依赖C编译程序去查错;缺少实时检查,如数组越界等。1.2.3 C程序的基本结构

在介绍C程序的基本结构与特征前,我们先看如下两个C程序的例子。

例1.1 向控制台(显示器)输出信息"This is my first program."。

#include /*预处理命令:包含有标准输入输出库函数的头文件stdio.h*/

void main()/*主函数*/

{printf("This is my first C program.\n");

}

例1.2 输入两个数a、b,并输出其最小值。

分析:输入两个数a、b,调用自定义函数min(a,b),求出其最小值并赋给c,然后输出最小值c。

#include

int min(int a,int b) /*用户自定义函数*/

{return a

}

void main()/*主函数*/

{int a,b,c; /*变量定义*/scanf("%d%d",&a,&b); /*调用标准库函数scanf*/c=min(a,b); /*调用自定义函数min*/printf("min=%d\n",c); /*调用标准库函数printf*/

}

通过以上两个例子可以看出,任何一个C程序有且仅有一个称之为主函数的main函数。程序执行从主函数开始,其他函数通过主函数直接或间接调用才能执行,主函数执行结束时,标志程序执行结束。

函数的基本结构为:

[返回值类型]函数名([形参说明表])

{变量定义部分;语句执行部分;

}

其中,C程序中的函数要用到的变量必须先定义,然后才能使用,因此变量定义在执行语句前。函数的定义和调用将在第6章进行详细讲解。1.2.4 C程序的书写格式

在编辑C语言源程序时,我们应注意如下几点。(1)C程序采用块注释方法,块注释书写方法为:

/*注释部分*/

注释部分只为了提高程序的可读性,不参与程序的编译和运行。但在书写格式上要注意:“/”与“*”之间或“*”与“/”之间不能有空格。C程序在Visual C++ 6.0编程环境下,也可采用C++的注释方法,即若要对某行进行注释,只需在该行前面加上两个正斜杠符“//”即可。

注意

和注释符号/*、*/一样,圆括号( )、花括号{ }、方括号[ ]都必须成对使用。(2)标识符用来表示函数、类型及变量的名称,它是字母、下划线和数字的排列,但必须用字母或下划线开头。

Turbo C 2.0对于标识符的规定最长可允许32个字符。读者应注意编程序时所用系统对标识符长度的规定,有的系统对标识符的使用往往有较多的限制。对于初学者来讲,建议在程序中标识符一般不要取得太长。

下面给出一些合法与不合法命名的标识符。

合法标识符:_s78、ave_1、snoopy2、func、B567ill。

不合法标识符:fat*9、$100_、a#b、s-t、8y9。

注意

C语言是区分大小的。如:MAX、max和Max表示的是3个不同的标识符。(3)C语言一般采用小写字母作为关键字。关键字是一种语言中规定具有特定含义的标识符。关键字不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。根据ANSI标准, C语言可使用以下32个关键字:

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、union、unsigned、void、volatile、while(4)C程序书写格式灵活,一个语句可连续写在多行上,一行也可以写多个语句。如例1.2中的min函数可以写成如下形式:

int min(int a,int b){ return a

Turbo C提供了多个头文件,分类包含了各类标准函数的原型说明,需要用到某些标准库函数时,只需将对应的头文件用#include语句包含在程序的首部就可直接使用了,头文件的扩展名一般为 .h。1.3 算法及其描述

存储程序和程序控制是现代数字电子计算机自动工作的基本原理。一个程序应包括对数据的描述和对数据处理的描述。1.3.1 算法与程序

著名计算机科学家沃思(Nikiklaus Wirth)提出如下一个公式:程序=数据结构+算法

对数据的描述,即为数据结构。在C语言中,系统提供的数据结构,是以数据类型的形式出现的。

算法是为解决一个问题而采取的方法和步骤,是对数据处理的描述,是程序的灵魂。

计算机不仅能够完成精确的科学计算,还能够进行复杂的数据处理。计算机进行的一切工作都是按照人们事先确定的处理方案,让计算机执行指定的操作步骤,才能得到满意的结果。计算机解题的整个过程一般要经过以下几个阶段。

1.建立模型

该阶段根据所要解决的问题,分析用户需求,找出用户使用的已知数据和相关的条件,明确需要输入什么数据,以及处理对象,明确需要进行哪些处理,明确需要输出的结果数据。根据这些,将模型抽象出来,俗称“建模”。

2.设计算法

根据建立好的模型,用计算机语言所提供的各种编程结构和数据结构来设计算法。

如果是复杂的数值计算问题,就要建立数学模型,即要将一个物理过程或工作状态用数学形式表达出来,列出计算公式或方程(组)及计算过程的说明。

如果是非数值计算问题,就要按照信息处理的要求提出处理方法,确定信息处理系统的总体功能。

确定处理方案是解题的关键。对于同一个问题,往往可以制定多种不同的方案来进行数据处理,不同的方案决定了不同的处理步骤,处理效果也可能大不一样。因而在确定处理方案时,应当对不同的方案进行充分的比较,以便确定最优的处理方案。该阶段根据已确定处理方案,具体列出计算机要完成的功能项目,列出计算机要进行的操作步骤,写出计算机解题的算法。

3.编写程序

根据之前描述的算法,用一种计算机语言编写出能完成确定的功能和解题操作的程序。

4.调试和运行程序

程序由计算机能够接受和执行的一系列语句(命令)组成。程序是计算机软件的本体,程序质量的好坏决定了软件的质量。

该阶段将编写好的程序输入计算机进行调试,找出程序中的所有语法错误和逻辑错误,修正程序,并测试程序在不同情况下能否正常运行,直到程序运行正常,能够得到预期的结果。调试通过的程序才能投入正式运行。调试程序是保证程序正确的重要环节。1.3.2 算法的概念

算法,通俗地讲就是一种解题方法,所要采取的、确定的、有限的解题步骤。计算机解题的算法,严格地讲是由若干条指令组成的有穷序列。

从广义讲,做任何事情都有一个过程,即事情经过的步骤,这也可以看作做事情的算法。从某种意义上说,要认真做好任何一件事情,达到预想的目的,都需要先确定好算法。在进行计算机程序设计的过程中,我们必须充分认识算法的重要性。

例如,我们要计算机求出两个整数的和的算法,可以描述如下。(1)定义3个变量,并给3个变量分别分配内存空间,用于存放整数值。(2)给2个变量,分别赋给26、16两个整数。(3)求出两个整数和的数值,赋给第三个变量。(4)输出第三个变量的值。(5)运行结束。

以上的描述就是一个计算机解题的算法。1.3.3 算法的特点“确定的、有限的”是算法的最重要的规则,一个算法必须满足以下5个规则。(1)算法的有穷性。一个算法中的执行步骤是有限的,即在执行有穷步后结束,并且算法中的每一条指令执行的次数都是有限的。(2)算法的可行性。算法中描述的操作步骤,每一个步骤都是可以通过已经实现的基本操作指令执行有限次完成,每条指令的执行时间都是有限的,保证了整个算法的实现。(3)输入,一个算法有0个或多个输入的外界量,它们是算法中最初给出的数据,取自于特定对象的集合。(4)输出,一个算法有一个或多个输出的量,它们是与输入有某种关系的量。(5)算法的确定性。算法中的每一个操作的含义必须明确,无二义性。并且在一定条件下,算法的执行路径是唯一的。

需要说明的是,在一个算法中,有些指令可能是重复执行的,因此一个算法的指令的执行次数可能远远大于算法中的指令条数。1.3.4* 算法的描述方法

从上面的分析可知,算法是描述某一问题求解的有限步骤,而且必须有结果输出。设计一个算法或者描述一个算法,最终是由程序设计语言来实现的。但算法与程序设计又有区别,主要是一个由粗到细的过程。算法是考虑实现某一个问题求解的方法和步骤,是解决问题的框架流程;而程序设计则是根据这一求解的框架流程进行语言细化,实现这一问题求解的具体过程。

一般可以使用以下几种类型的工具描述算法。

1.自然语言

自然语言即人们日常进行交流的语言,如英语、汉语等。用自然语言用来描述的算法通俗易懂,便于用户相互之间进行交流。但是,由于自然语言表示的含义往往不太严格,随意性较大,容易出现歧义性表述。另外将自然语言描述的算法直接在计算机上进行处理,目前还存在许多困难,包括诸如语音、语义识别等方面的问题。因此,除了简单问题以外,一般不使用自然语言来描述算法。

2.流程图

要对某一个算法进行描述,可以借助有关的图形工具或代码符号。常用的工具有流程图、N-S图等。

流程图是一种传统的算法表示法,程序流程图是人们对解决问题的方法、思路或算法的一种描述。它利用图形化的符号框来代表各种不同性质的操作,并用流程线来连接这些操作。

图1.1所示为我国国家标准GB 1526—89中推荐的一套流程图标准化符号的一部分。图1.1 流程图标准化符号

我们对常用的符号进行一些解释。(1)矩形:一般用作要执行的处理(process),在程序流程图中作为执行框。(2)圆角矩形或者扁圆:表示程序的开始或者结束,在程序流程图中用作为起始框或者结束框。(3)箭头:表示执行方向与顺序。(4)菱形:表示决策或判断(例如:If...Then...Else),在程序流程图中用作判别框。(5)圆形:表示连接,一般是表示同一流程图从一个进程到另一个进程的交叉引用。(6)平行四边形:一般表示数据,或确定的数据处理,或者表示资料输入(Input)和输出(output)。

例 1.3 考生参加某培训中心的考试需要遵循以下程序:在考试之前咨询考试事宜,如果是新考生,需要填写考生注册表,领取考生编号,明确考试科目和时间,然后缴纳考试费,按规定时间参加考试,领取成绩单,领取证书;如果不是新考生,则需出示考生编号,明确考试的科目和时间,然后缴纳考试费,按规定时间参加考试,领取成绩单,领取证书。设计一个流程图,表示这个考试流程。

解题思路:在画流程图之前,先将上述流程分解为若干个比较明确的步骤,并确认这些步骤之间的关系。显然,“咨询考试事宜”是每一名考生都要做的事情,接着,新考生和老考生执行不同的步骤,新考生“填写考生注册表,领取考生编号”,老考生“出示考生编号”,然后,共同执行以下步骤:“明确考试科目和时间”“缴纳考试费”“按规定时间参加考试”“领取成绩单”和“领取证书”。

用流程图表示考试流程如图1.2所示。图1.2 流程图示例

说明

在画流程图前,先将上述流程分解成若干比较明确的步骤,并确定这些步骤之间的关系,注意新考生与老考生的不同程序、画图中如果自上而下画图对于篇幅有限制,可采用从左到右的方式,灵活处理实际问题,但应注意过程的简单明了与美观。

3.N-S图

在NS图中,每个“处理步骤”是用一个盒子表示的,所谓“处理步骤”可以是语句或语句序列。需要时,盒子中还可以嵌套另一个盒子,嵌套深度一般没有限制,只要整张图在一页纸上能容纳得下,由于只能从上边进入盒子然后从下边走出,除此之外没有其他的入口和出口,所以, NS图限制了随意的控制转移,保证了程序的良好结构。

C语言中有3种基本结构是:顺序、选择、循环。

用N-S图表示如图1.3所示。图1.3 三大基本结构N-S图示例1.4 Visual C++ 6.0集成开发环境

C语言的编译系统有很多种,本书采用Visual C++ 6.0集成开发环境,本节将介绍在此环境下如何编辑、编译、连接和运行C程序。1.4.1 C程序可执行文件的生成过程

C语言程序可执行文件的生成过程如图1.4所示。图1.4 C程序可执行文件的生成过程(1)利用编辑器生成文本文件,该文本文件又称为C/C++源程序,其扩展名为.cpp或.c。编辑器可以是C系统提供的,也可以是其他文本编辑器,如Notepad、Edit、Edlin等。(2)采用C编译器将源程序编译为二进制的机器目标文件,生成的目标文件扩展名为.obj。(3)采用C连接程序将目标文件与库文件连接,生成可执行文件,可执行文件扩展名为.exe。1.4.2 Visual C++ 6.0上机操作过程

基于Windows操作系统的Visual C++ 6.0开发环境是一个包含C语言子集的可视化集成开发环境(Integrated Development Environment,IDE),它可以通过单击菜单选项或工具栏按钮进行编辑、编译、连接、运行和调试等操作。在Visual C++ 6.0开发环境下,C程序按工程(project)进行组织,每个工程可包括一个或多个C或CPP源文件,但只能有一个main函数。下面以例1.1为示例(例1.1源文件命名为SYFL1_1.c)介绍在Visual C++ 6.0中建立工程并进行C程序调试的主要操作步骤。

1.启动Microsoft Visual C++ 6.0

从桌面上或“开始”按钮中的“程序”项中启动Microsoft Visual C++ 6.0,打开这个集成开发环境(见图1.5)。图1.5 打开Microsoft Visual C++ 6.0开发环境

2.新建一个C源文件

在打开的(文件)菜单中选择新建按钮(见图1.5),打开新建(new)标签,再选择文件(File)标签,选择文件类型为C++Source File,输入源文件名如SYFL1_1.c,选择保存源文件的位置(见图1.6),按确定按钮后将生成一个新的空文件SYFL1_1.c。

3.编辑过程

出现源文件编辑窗口(见图1.7),在编辑窗口中输入与修改程序代码,完成后可保存源文件。

4.编译过程

选择下拉菜单—组建(Build)|编译(Compile),对应的快捷方式为Ctrl+F7,将生成.obj目标文件。图1.6 新建C源文件的对话框图1.7 编辑窗口

5.连接过程

选择下拉菜单—组建(Build)|组建(Build),对应的快捷方式为F7,将生成.exe可执行文件。

6.运行程序

选择下拉菜单—组建(Build)|开始调试(Start Debug)|运行(Go),对应的快捷方式为F5,将运行生成的.exe文件。也可以选择下拉菜单—组建(Build)|执行(!Execute),对应的快捷方式为Ctrl+F5,将运行生成的.exe文件。

如果用户修改了C/C++源程序,必须对源文件重新进行编译、组建,才能执行修改后的程序。习题

一、选择题

1.一个完整的可运行的C源程序中( )。

A.可以有一个或多个主函数

B.必须有且仅有一个主函数

C.可以没有主函数

D.必须有主函数和其他函数

2.构成C语言源程序的基本单位是( )。

A.子程序

B.过程

C.文本

D.函数

3.C语言规定,一个C源程序的主函数名必须为( )。

A.program

B.include

C.main

D.function

4.下列说法正确的是( )。

A.在书写C语言源程序时,每个语句以逗号结束

B.注释时,“/”和“*”号间可以有空格

C.无论注释内容的多少,在对程序编译时都被忽略

D.C程序每行只能写一个语句

5.在Visual C++ 6.0开发环境下,C程序按工程(project)进行组织,每个工程可包括( ) C/CPP源文件,但只能有( )main函数。

A.1个

B.2个

C.3个

D.1个以上(含1个)

6.下列4个变量名中,哪一个是正确的( )。

A.int

B.8bl

C.s12

D.#jk9

二、判断题(下列各题,请在正确的题后打“√”,错的打“×”)

1.C语言是一种计算机低级语言。

2.C语言允许直接访问物理地址,能进行位操作。

3.C语言是面向对象程序设计语言。

4.C程序要通过编译、连接才能得到可执行的目标程序。

5.用C语言,可以编写出任何类型的程序。

6.每一个C语言程序允许有多个函数。

7.C语言的书写格式,允许一行内可以写几个语句。

8.C语言程序的语句无行号。

9.C语言程序的每个语句的最后必须有一个分号。

10.一个完整的C语言程序,由一个主函数和若干个其他函数组成,或仅由一个主函数构成。第2章 基本数据类型与运算符

本章主要介绍C语言基本数据类型和对基本类型数据的各种运算,这些运算主要包括算术运算、关系运算、逻辑运算、赋值运算、条件运算等。2.1 基本数据类型和取值范围

C语言定义了几种基本数据类型:字符型(char)、整型(int)、浮点型(float)和双精度型(double),它们是构造其他数据类型的基础。本节针对基本数据类型的常量和变量进行了详细介绍。2.1.1 基本数据类型和取值范围

1.基本数据类型

在计算机中,所有的数据都采用二进制形式表示,4种基本数据类型规定了数据在内存中占用的二进制位数/字节数,从而也规定了数据的取值范围。与数据类型相关的是类型修饰符,对于整数类型有两类修饰符,一类是符号修饰,另一类是长度修饰。其中符号修饰符有带符号(signed)和不带符号(unsigned)之分,默认为带符号(signed)修饰;长度修饰有短型(short)和长型(long)之分,这些数据长度与具体机器编译环境有关。例如,在Visual C++ 6.0编程环境下,int类型与long类型一样,都是占4字节(32位);而在Turbo C 2.0编程环境下,int类型与short类型一样,都是占2字节(16位)。本书以Visual C++ 6.0作为开发环境,其主要数据类型和取值范围如表2.1所示。表中类型带中括号的项表示是格式中的可选项。

关于数据取值范围,我们以16位整型数为例进行说明,其他类型数据取值范围可依此类推。不带符号 unsigned short 类型最大值为 161111111111111111,即 65535(2−1),最小值为0000000000000000,即 0;带符号 signed short 数采用二进制补码形15式表示,其最大值为0111111111111111,即32767(2−1),其最15小值为1000000000000000,即−32768(−2)。表2.1 数据类型和取值范围续表

C语言数据分为两类,一类为常量,另一类称为变量。常量是指在程序运行过程中数值不发生变化的量,如5,'a',"Hello,world";变量是指程序运行过程中,可以发生变化的量,如a等。

2.变量的定义

变量的定义格式为:

[存储类型]数据类型 变量名;

例如:

int a, a5, _a;

float _a5, A5;

其中,变量类型可以是表2.1中的任何数据类型,变量命名必须遵守以下C标识符命名规则:(1)第1个字符必须是字母或下划线;(2)其余字符可以是字母、下划线和数字;(3)字母区分大小写;(4)用户自定义标识符不能与C语言的保留字或预定义标识符同名,并应尽量做到“见名知意”,以增加程序的可读性。

变量没有赋初值时,变量中存放的是一随机值。变量定义时可同时赋初值,称之为变量的初始化,例如:

int a=1,a5=10;

定义变量包括两个方面的含义:一是给变量分配了存储空间和规定了变量的取值范围,从而可以对变量进行存储操作,如上述举例中,为变量a、a5、_a各分配了两个字节空间,为变量_a5、A5各分配了4个字节,变量有了存储空间,也就有变量地址,如&a、&a5、&_a分别表示变量a、a5、_a的首地址;二是规定了其允许的操作,如实数可进行加、减、乘、除运算,但不能进行求余运算。2.1.2 整型常量

C语言中整型常量按进制划分有十进制、八进制(前缀为数字0)、十六进制(前缀为数字0X或0x)3种。数据377按这3种进制的格式可分别表示为:377、0571、0x179(或0X179)。

整型常量按长度划分为两种:短整型和长整型(后缀为小写字母l或大写字母L),其中默认为短整型,如−377是一个短整型数,而−377l或−377L表示−377是长整型数。

长度和进制可进行组合,如377L、0571L、0x788L分别表示十进制、八进制、十六进制长整型数。2.1.3 实型常量

实型常量有两种表示方法,一类是标准计数方法,如PI值表示为3.1415926,另一类可以采用科学计数法,科学计数法的一般形式为:

尾数E阶码

尾数e阶码

如PI值可以表示为如下形式:

3.14159E0 3.14159e0 0.314159E1 31.4159e-1。2.1.4 字符常量

字符常量用一对单引号包围,如'5'、'a'、'A'、' '等,每个字符占一个字节。在计算机中,字符按ASCII值存放,见附录1,上述对应的4个字符的ASCII值分别为53、97、65、32等,因此字符也可以参加整型运算。由于字符用单引号包围,单引号字符不好表示,在C语言中这些不好表示的字符可在字符前面加反斜杠\区分,称之为转义字符,如\'表示单引号。常用的转义字符如表2.2所示。表2.2 常用转义字符表

字符也可用八进制或十六进制形式表示:

八进制 \ooo

十六进制 \xhh

如\101、\x41均表示大写字母A。

例2.1 转义字符与字符运算举例,分析下列程序运行结果。

#include

main()

{char c='a';c=c+1;printf("\n%c\n",c);printf("The token of RMB is:\n\t\t\t Y\b=");

}

在屏幕上的输出结果为:

b

The token of RMB is:

=

在打印机上的输出结果为:

b

The token of RMB is:¥2.1.5 字符串常量

字符串常量是用一对双引号包围的字符数组,如"Hello,world! ",它们在内存中是按照每个字符的ASCII码连续存放的,并在结尾处添加了一结束标志'\0',对应的ASCII值为0,这样n个字符组成的字符串需占用n+1个字节。因此,12个字符组成字符串"Hello,world! "在内存(使用十六进制编码表示)中占用13个字节,其存储形式如图2.1所示。图2.1 字符串"Hello,world!"的存储表示

值得注意的是:(1)字符串中包含有双引号字符时,字符双引号必须用转义字符表示;(2)一个字符串需占用两行时,需采用两对双引号,具体可参见例2.2。

例2.2 字符串常量分两行表示的实例。

#include

main()

{printf("This string""is too long!");

}

程序运行结果如下:

This string is too long!2.2 运算符与表达式

运算符是一种说明一个特定的数学或逻辑运算的符号,表达式是用运算符(操作符)将运算数(操作数)连接起来的式子。2.2.1 优先级与结合规则

基本数学的运算符有加减乘除,顺序是这样规定的:先乘除后加减,从左至右依次进行。这句话包含了两层意思:先乘除后加减表明了乘除运算符的优先级别比加减运算符优先级别高;在同一级别运算时,按从左至右依次进行,表示另一种规则,即结合规则,对于算术运算的结合规则是按从左至右进行的,即左结合性。C语言中除了算术运算符之外,还有其他一些运算符,这些运算符的优先级别和结合规则如表2.3所示,从表2.3中我们可以看出加减运算符的级别为4级,比运算级别为3级的乘除运算符级别要低。表2.3 运算符的优先级和结合规则

算术运算符+、-、*、/等只允许带左右两个运算数的运算符称为二元运算符(或二目运算符、双元运算符),负号运算符(-)只允许有一个运算数的称为单元运算符(或单目运算符、一元运算符)。C语言中只有一个三元运算符,即条件运算符,它允许带3个运算数。

当由多个不同运算符和运算数组成较为复杂的表达式时,其运算符计算顺序按如下规则执行:(1)不同级别的运算符按运算符的优先级别确定计算顺序,优先级别高(优先级别数小)的运算符先计算,优先级别低(优先级别数大)的运算符后计算;(2)相同级别的运算符按结合规则确定计算顺序。

如表达式

3+4*(12-6)/(1+2)

的计算顺序为:①左边括号运算(12-6),值为6,②右边括号运算(1+2),值为3,③左边乘法运算4*6,值为24,④右边除法运算24/3,值为8,⑤加法运算3+8,值为11。2.2.2 赋值运算与连续赋值

简单赋值运算的一般形式为

变量=表达式

其功能是将一个表达式的值赋给变量。表达式如下。

a=b+c该式读作将表达式b+c的值赋给a。其本意是改写变量a的值,而不是判断b+c与a是否相等,初学者往往将C语言中的赋值运算符看作为数学上的关系运算符—等于运算符,这是错误的。又如数学上将表达式

a=a+5

看作错误的表达式,在C语言中这是正确的合法表达式,它是在改写存储单元a中的内容,因为

在C语言中,运算符“=”不是关系运算符,而是赋值运算符。

在C语言中,赋值运算符的级别较低,为14级,并满足右结合规则。因此表达式

x=y=z=1

是连续赋值表达式,其功能相当于如下表达式的功能。

x=(y=(z=1))

它是先执行表达式z=1,即将1赋给z,表达式值也为1,然后将表达式值1赋给y,即执行y=1,表达式值也仍为1,再将表达式值1赋给x,即执行x=1。2.2.3 算术运算

C语言中算术运算符有加“+”、减“-”、乘“*”、除“/”、求余(模)“%”“++”“--”7个。其中+、-运算符级别为4级,*、/、%运算符级别为3级,它们都满足左结合性,都是二元运算符,+、-、*、/都能对整数或实数进行运算。

1.求余运算符%

求余运算符%只能对整型数据进行运算,如5%2的值为1,5%3值为2。

如果计算:

a%b

时,如果a、b中至少有一个为负数,此时运算结果如何呢?C语言中规定,其结果:余数与a的符号相同,而绝对值不变。因此表达式7%3、7%-3、-7%3、-7%-3的值分别为1、1、-1、-1。

2.++、--运算符

++、--为一元运算符,级别为2级,满足右结合性,只能对整型变量进行运算。表达式++a或a++表示a的值自增1,而--a或a--表示a的值自减1。例如,若有定义:

int a=5;

则执行

a++

++a

a的值为6;执行

a--

--a

a的值为4。

++、--运算符可写在变量的前面或变量的后面,写在变量的前面称为前缀(或前置)运算符,写在变量的后面称为后缀(或后置)运算符,在使用前缀运算与后缀运算时要注意如下两点。(1)++a与a++单独构成表达式时,两者使用时没有区别。(2)++a与a++不是单独构成表达式时,前缀运算表示先加后用,后缀运算表示先用后加。

先用后加指的是先读取a的数据使用,当表达式中比逗号运算符高的运算符都执行完后,a再进行自加运算。先加后用指的是先对a进行自加运算,然后再读取a进行其他运算。

上面我们仅以++为例进行说明,对于--运算也有相似的规则:前缀表示先减后用,后缀表示先用后减。

例2.3 分析下列程序的运行结果。

#include

main()

{int a,b;a=3;b=a++;printf("a=%d b=%d\n",a,b);a=3;b=++a;printf("a=%d b=%d\n",a,b);a=3;b=++a*++a; printf("a=%d b=%d\n",a,b);a=3;b=++a*a++; printf("a=%d b=%d\n",a,b);a=3;b=a++*++a; printf("a=%d b=%d\n",a,b);a=3;b=a++*a++; printf("a=%d b=%d\n",a,b);a=3;printf("++a=%d a++=%d\n",++a,a++);

}

程序运行结果为:

a=4 b=3

a=4 b=4

a=5 b=25

a=5 b=16

a=5 b=16

a=5 b=9

++a=4 a++=3

选取上例运算结果中的几行进行分析。(1)运行结果中的第一行分析:此为后缀运算,先读取a的值3赋给b(b值为3)后,a再执行自加运算,a值为4。(2)运行结果中的第5行分析:第一个++为后置运算,需等赋值运算执行完后才执行,留待以后执行自加运算,第二个++为前置运算,先进行自加后a值为4,然后在a的同一存储单元中两次读取a进行乘法运算,此时两次读取的数据都为4,乘法结果16赋给b,赋值运算执行完后,执行留待的后置自加运算a值为5。(3)*运行结果中的最后一行分析:这里首先应明白C语言中参数传递是自后向前的传递方式(这与其他高级语言如Pascal是不同的),再来分析其运算结果,首先传递的是a的后置自加运算,先用后加,先用的a值为3,即输出结果为3(而加1要在用完后,即Printf输出完成后才进行),然后传递的是a的前置自加运算,先加后用,a先自加使a的值为4,后用的a值为4,即输出结果为4。对于其他运算结果,也不难进行分析得出。

注意

最后一行语句在Turbo C 2.0中的运行结果为“++a=5 a++=3,”这说明不同的编译器处理有差别,建议初学者尽量避免例2.3中的这些稍复杂的用法,因为这些语句完全可以用简单而功能明确的语句替代。2.2.4 关系运算

关系运算又称为比较大小运算,它有6个运算符:>、>=、<、<=、==、!=,它们的结合规则都是自左向右的。其中>、>=、<、<=等4个运算符级别为6级,它们比==、!=等两个运算符级别为7级的要高。关系运算的结果为逻辑真或逻辑假,关系成立时为逻辑真(值为1),关系不成立时为逻辑假(值为0)。表达式如下。

5>3 5>=3 5<3 5<=3 5= =3 5!=3

的逻辑值分别为

1 1 0 0 0 1

关系运算的等于运算符==与数学上的等于运算符=具有相同的含义,与C语言中的赋值运算符=是完全不同的,这一点初学者往往容易搞错。2.2.5 逻辑运算、连续比较和逻辑优化

C语言中逻辑运算符有3个,分别是逻辑与&&(11级、左结合)、逻辑或||(12级、左结合)、逻辑非!(2级、右结合)。逻辑与表达式a&&b表示a与b中只要有一个条件不满足(值为0),其运算结果为0。逻辑或表达式a||b表示a与b中只要有一个条件满足(值为1),其运算结果为1。逻辑非表达式!a,当a为1时,结果为0,当a为0时,结果为1。逻辑运算真值表如表2.4所示。表2.4 逻辑运算真值表

在C语言逻辑运算中,任何非0值都当作逻辑值1处理,因此表达式0.1||0的结果值为1。

关于逻辑优化的问题:从逻辑与运算a&&b的真值表中,我们可以看出,只要a值为0,不管b值如何,其运算结果都为0,因此,在进行逻辑与运算时,只要计算a值为0,我们不需计算b值,这种情况,我们称之为逻辑与优化。同样,对于逻辑或运算a||b,只要a值为1,不需计算b值,此时表达式值恒为1,这种情况称之为逻辑或优化。

例2.4 逻辑运算。

#include

main()

{int x,y,z;x=y=z=0;++x|| ++y|| ++z;printf("x=%d y=%d z=%d\n",x,y,z);x=y=z=0;++x&&++y|| ++z;printf("x=%d y=%d z=%d\n",x,y,z);x=y=z=0;++x&&++y&&++z;printf("x=%d y=%d z=%d\n",x,y,z);x=y=z=0;++x|| ++y&&++z;printf("x=%d y=%d z=%d\n",x,y,z);

}

程序运行结果为:

x=1 y=0 z=0

x=1 y=1 z=0

x=1 y=1 z=1

x=1 y=0 z=02.2.6 位运算

1.位运算操作符

位运算符有&、|、^、~、>>、<<6个,其含义如表2.5所示。表2.5 位运算符号表

2.异或运算

异或运算真值表如表2.6所示,即对应位相同时结果为0,不同时结果为1。表2.6 异或运算真值表

3.移位运算

左移位运算a<>b,右边移出的部分将丢弃,左边空出的高位部分填补方法则根据a是否为带符号数又分为两种:a为带符号数时,左边空出的高位部分用符号位填补;a为不带符号数时,左边空出的高位部分用0填补。

例2.5 位运算。

#include

main()

{char a= -25,b=93,c;unsigned char d= -25;c=a&bprintf("%d\n",c);c=a|b;printf("%d\n",c);c=a^b;printf("%d\n",c);c=~a;printf("%d\n",c);b=3;c=a>>b;printf("%d\n",c);c=d>>b;printf("%d\n",c);a=25;c=a>>b;printf("%d\n",c);c=a<

}

程序运行结果为:

69

−1

−70

24

−4

28

3

−562.2.7 条件运算

条件运算符是C语言中唯一的三元运算符,用符号?:表示,它带有3个操作数,优先级为13级,结合规则为右结合,其书写一般形式为:

a?b:c

其计算方法是先计算a,若a非0,则选择b作为表达式值,否则若a为0,则选择c作为表达式值,因此,条件运算又称为选择运算。

例2.6 条件运算—输入两个整数,选择其中较大的数输出。

#include

main()

{int a,b,c;scanf("%d%d",&a,&b);c=a>b?a:b;printf("%d",c);

}

程序运行结果为:

3 5↙ (箭头表示从键盘输入)

52.2.8 复合赋值运算

同赋值运算一样,复合赋值运算符也是二元运算符,运算级别为14级,结合规则为右结合。复合赋值运算符共有10个,其含义如表2.7所示。复合赋值运算与其他运算相结合时,应特别注意其运算优先级与结合规则。如表达式:

a/=b+c*d

相当于表达式

a=a/(b+c*d)

因为复合赋值运算符/=优先级别比+、*的优先级别低。表2.7 复合赋值运算符2.2.9* 逗号运算

逗号运算符是C语言中级别最低的运算符,15级,结合规则为左结合。其一般形式如下:

e1,e2,e3,…,en

其功能为先计算表达式e1,然后计算表达式e2,再计算表达式e3……最后计算表达式en,其中表达式en的值为整个表达式的值。

例2.7 逗号表达式。

#include

main()

{int a=5,b=3,c,d;d=(c=a++,c++,b*=a*c,b/=a*c);printf("%d\n",d);printf("a=%d b=%d c=%d\n",a,b,c);

}

在例2.7中的逗号表达式c=a++,c++,b*=a*c,b/=a*c中,先计算第一个表达式c=a++得出c值为5,a值为6;计算第二个表达式c++后c值为6,计算第三个表达式b*=a*c后,b值为108,计算第四个表达式b/=a*c后b值为3。整个括号内表达式值为3赋给变量d,因此,最后输出结果为:

3

a=6 b=3 c=62.2.10 其他运算sizeof

sizeof表示计算变量或表达式占用的存储空间大小,即字节数,其运算级别为2级,结合规则为右结合。

sizeof计算类型占用字节数的形式为:sizeof(类型)

sizeof计算变量占用字节数的形式有两种:sizeof(变量)

或 sizeof变量

如有int a,b;

则sizeof(int) sizeof a sizeof(a)

都是合法的表达式,其值都为2。2.2.11* 类型转换与类型转换规则

C语言允许不同类型的数据进行混合运算,不同类型数据进行运算时需进行类型转换,C语言类型转换分为4类,即算术运算类型转换、赋值转换、强制类型转换和输入/输出类型转换。

1.算术运算类型转换

算术运算中,当两个运算数类型相同时,运算结果类型与原类型

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载