【C语言学习笔记】第一章:程序设计和C语言

目录

 

1 计算机程序

2 计算机语言

2.1 机器语言

2.2 符号语言

2.3 高级语言

3 C语言的发展及其特点

3.1 C语言起源

3.2 C语言特点

4 C语言应用范围

5 运行C语言的步骤和方法

5.1 编辑源程序

5.2 预处理(Preprocessing)

5.3 编译(Compilation)

5.4 汇编(Assemble)

5.5 链接(Linking)

6 程序设计的任务


1 计算机程序

        计算机程序就是一组计算机能识别和执行的指令序列,一个特定的指令序列用来完成一定的操作,告诉计算机要做的事以及如何做,如从内存中获取数字并从内存移动到寄存器。只要让计算机执行这个程序,计算机就会“自动地“执行各条指令,有条不紊地进行工作。

        传统的程序可以归结为“程序=算法+数据结构”,算法就是计算机解决数值计算或非数值计算问题的方法与步骤。数据结构是计算机存储、组织数据的方式。

2 计算机语言

        人和计算机需要语言来进行信息交流,计算机语言是面向计算机的人造语言,是进行程序设计的工具,因此也称为程序设计语言。计算机语言经历了以下几个发展阶段 。

2.1 机器语言

        计算机工作基于二进制,从根本上说,计算机只能识别和接受由01组成的指令。要使计算机知道和执行自己的意图,就要编写许多条由0和1组成的指令,然后需要用纸带穿孔机以人工的方法在特制的黑色纸带上穿孔,在指定的位置上有孔代表1, 无孔代表0 。 一个程序往往需要一卷长长的纸带 。 在需要运行此程序时就将此纸带装在光电输入机上,当光电输入机从纸带读入信息时 ,有孔处产生一个电脉冲,指令变成电信号,让计算机执行各种操作 。如1011011000000000让计算机进行一次加法运算。

        计算机能直接识别和接受的二进制代码称为机器指令 (machine instruction) 。机器指令的集合就是该计算机的机器语言 (machine language) 。

        显然,机器语言与人们习惯用的语言差别太大,难学,难写,难记,难检查,难修改,难以
推广使用。因此初期只有极少数的计算机专业人员会使用机器语言编写计算机程序 。

2.2 符号语言

        为了克服机器语言的上述缺点,人们创造出符号语言 (symbolic language) ,它用一些英文字母和数字表示 一个指令。例如用ADD代表”加", SUB 代表 ”减", LD代表“传送”等 。如ADD A,B,表示执行A + B => A, 将寄存器A中的数与寄存器B中的数相加,放到寄存器A中。

        显然,计算机并不能直接识别和执行符号语言的指令,需要用一种称为 汇编程序的软件把符号语言的指令转换为机器指令 。一般,一条符号语言的指令对应转换为一条机器指令。转换的过程称为“代真”或“汇编",因此,符号语言又称为 符号汇编语言 (symbolic assembler language) 或 汇编语言 (assembler language) 。

        虽然汇编语言比机器语言简单好记一 些,但仍然难以普及,只在专业人员中使用 。不同型号的计算机的机器语言和汇编语言是互不通用的 。机器语言和汇编语言是完全依赖于具体机器特性的,是面向机器的语言 。由于它“贴近“计算机,或者说离计算机“很近“, 称为计算机低级语言 ( low level language) 。

2.3 高级语言

        为了克服低级语言的缺点,20世纪50年代创造出了第一个计算机高级语言——FORTRAN 语言 。 它很接近于人们习惯使用的自然语言和数学语言 。在FORTRAN语言程序中,想计算和输出
3.5 X 6sin ( \pi/ 3 ), 只须写出下面这样一个语句:PRINT * , 3.5 * 6 * SIN(3. 1415926/ 3)。

        当然,计算机也是不能直接识别高级语言程序的,也要进行”翻译“。用一种称为编译程序的 软件把用高级语言写的程序(称为源程序 (source program) 转换为机器指令的程序(称为目标程序 (object program)),然后让计算机执行机器指令程序,最后得到结果 。

        这种语言功能很强,且不依赖于具体机器,用它写出的程序对任何型号的计算机都适用(或只须作很少的修改),它与具体机器距离较“远“,故称为计算机高级语言(high level language) 。

        高级语言经历了不同的发展阶段:

        (1) 非结构化的语言 。 初期的语言属于非结构化的语言,编程风格比较随意,只要符合语法规则即可,没有严格的规范要求,程序中的流程可以随意跳转,程序难以阅读和维护。早期的 BASIC, FORTRAN和 ALGOL 等都属于非结构化的语言。

     (2)结构化的语言。结构化的语言也称为面向过程的语言。在面向过程程序设计中,问题被看作一系列基于函数完成的任务,其概念最早由E.W.Dijikstra在1965年提出。结构化语言规定程序必须由具有良好特性的基本结构(顺序结构、选择结构、循环结构)构成,程序中的流程不允许随意跳转,程序总是由上而下顺序执行各个基本结构 ,其基本思想是采用"自顶向下,逐步求精"的程序设计方法和"单入口单出口"的控制结构。这种程序结构清晰,而且将程序中的数据与处理数据的方法分离,易于编写、阅读和维护。BASIC,FORTRAN 77 和 C 语言等属于结构化的语言。

     (3)面向对象的语言 。 面向对象语言(Object-Oriented Language)是一类以对象作为基本程序结构单位的,指用于描述的设计是以对象为核心,而对象是程序运行中的基本成分。语言中提供了类、属性、方法等成分,有封装、继承、多态三大特性。C ++, C #, Visual Basic 和 Java 等语言是支持面向对象程序设计方法的语言 。 

3 C语言的发展及其特点

3.1 C语言起源

        1972年,美国贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)在开发UNIX操作系统时设计了C语言。他是在B语言(汤普逊发明)的基础上进行设计的。

        随着UNIX的日益广泛使用,C语言也迅速得到推广。1987年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(DennisRitchie)合著的The C Programming Language(《C语言程序设计》)第1版可算作“正式”的标准,所以此时的 C 也称为“K&R” C经典C。1978年以后,C语言先后移植到大、中、小和微型计算机上 。C 语言便很快风靡全世界,成为世界上应用最广泛的程序设计高级语言 。

        随着C的不断发展,越来越广泛地应用于更多系统中,C社区意识到需要一个更全面、更新颖、更严格的标准。鉴于此,1983年由美国国家标准局(American National Standards Institute,简称ANSI)开始制定C语言标准,于1989年12月完成,并在1990年春天发布,称之为ANSI C。该标准定义了C语言和C标准库。国际标准化组织于1990年采用了这套C标准(ISO C)。ISO C和ANSI C是完全相同的标准。ANSI/ISO标准的最终版本通常叫作C89(因为ANSI于1989年批准该标准)或C90(因为ISO于1990年批准该标准)。1999年,在做了一些必要的修正和完善后,ISO发布了新的 C 语言标准,命名ISO/IEC 9899:1999,简称“C99”。 在 2011 年 12 月 8 日,ISO 又正式发布了新的标准,称为ISO/IEC9899: 2011,简称为“C11”。此后有C17、C18等。

3.2 C语言特点

 (1) 语言简洁、紧凑,使用方便、灵活。C语言一共只有37个关键字、9种控制语句,

 (2) 运算符丰富。C语言的运算符包含的范围很广泛,共有34种运算符。

 (3) 数据类型丰富。C语言提供的数据类型包括:整型、浮点型、数组类型、指针类型、结构体类型和共用体类型等,C99又扩充了复数浮点类型、超长整型(long long)和布尔类型(bool)等

 (4) 具有结构化的控制语句。如if...else语句、while语句、do...while语句、switch语句和for语句)。

 (5) C是可移植的语言。这意味着,在一种系统中编写的 C程序稍作修改或不修改就能在其他系统运行。

 (6) 语法限制不太严格程序设计自由度大 。

 (7) C 语言允许直接访问物理地址 ,能进行位 (bit ) 操作 ,能实现汇编语言的大部分功能,可以直接对硬件进行操作 。

 (8) 生成目标代码质量高,程序执行效率高 。

4 C语言应用范围

                                                                                                 (图来自C Primer Plus(第六版))

5 运行C语言的步骤和方法

        用 C 语言编写的程序是源程序(.c) 。 计算机不能直接识别和执行用高级语言写的指令,典型的C实现通过编译链接两个步骤来完成这一过程。即使用编译程序(也称编译器)把 C 源程序翻译成二进制形式的目标程序(.obj),然后再将该目标程序与系统的函数库以及其他目标程序连接起来, 形成可执行程序(.exe)

gcc -o main main.c  //Linux一步编译

 C语言编译过程详解 - CarpenterLee - 博客园 (cnblogs.com)

5.1 编辑源程序

        用C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source code file),要求文件名以.c结尾,如filename.c。在文件名中,点号(.)前面的部分称为基本名(basename),点号后面的部分称为扩展名(extension)。

5.2 预处理(Preprocessing)

        也称为预处理,预编译用于将所有的#include头文件以及宏定义替换成其真正的内容,生成预编译文件(.i)。具体做的事如下:

  • 将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换
  • 处理所有的条件编译指令,#ifdef、#ifndef、#endif、#if、#else等
  • 处理#include,将#include指向的文件插入到该行处
  • 删除所有注释
  • 添加行号和文件标示,这样的在调试和编译出错的时候显示行号
  • 保留#pragma编译器指令,因为编译器需要使用它们
  • 预编译程序:高级语言→汇编语言的过程,.c/.h→.i
gcc -E main.c -o main.i

5.3 编译(Compilation)

        编译的过程实质上是把高级语言翻译成机器语言的过程。编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件(filename.s)。

  • 编译程序:高级语言→汇编语言的过程,.i→.s
gcc -S main.i -o main.s

5.4 汇编(Assemble)

        汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了,这一步产生的文件叫做目标文件(.o),是二进制格式。

  • 汇编程序:汇编语言→机器语言的过程,.s→.o
gcc -c main.s -o main.o

5.5 链接(Linking)

        链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。

gcc main.o -o main

6 程序设计的任务

        程序设计是指从确定任务到得到结果、 写出文档的全过程 。从确定问题到最后完成任务, 一般经历以下几个工作阶段 :

  1. 问题分析 。对于接手的任务要进行认真 的分析,研究所给定 的条件,分析最后应达到的目标,找出解决问题的规律,选择解题的方法 。 在此过程中可以忽略一些次要的因素,使问题抽象化,例如用数学式子表示问题的内在特性 。 这就是建立模型 。
  2. 设计算法 。即设计出解题的方法和具体步骤 。 例如要解一个方程式,就要选择用什么方法求解 . 并且把求解的每一个步骤清晰无误地写出来 。一般用流程图来表示解题的步骤 。
  3. 编写程序 。 根据得到的算法,用一种高级语言编写出源程序 。
  4. 对源程序进行编辑、编译和链接,得到可执行程序 。
  5. 运行程序,分析结果 。 运行可执行程序得到运行结果 。 
  6. 编写程序文档 。包括程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据.以及使用注意事项等 。程序文档是软件的一个重要组成部分,软件是计算机程序和程序文档的总称 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值