C语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 C语言的特点

1.2.1 C语言的特色

(1)C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器,产生少量的机器码及不需要任何运行环境支持便能运行的编程语言。

C语言也很适合搭配汇编语言来使用,往往可以内联汇编语言或与汇编语言目标文件一起连接。对于任何一种操作系统环境,C函数的ABI(Application Binary Interface)与汇编语言的子过程的ABI一定是完全兼容的。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好的跨平台特性,以一个标准规格写出的C程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

(2)C语言既有高级语言的优点,又在很多方面保留了低级语言速度快、可进行很多直接映射硬件结构的操作的长处,通过指针(pointer),C语言可以容易地对存储器进行低级控制。

我们最常用的Windows操作系统,就是用C语言和汇编语言写成的。基于这一点,很多人称C语言为“中级语言”,意思是它介于低级语言和高级语言之间。

(3)用C语言编写的程序非常简洁。C语言只有32个关键字,9种控制语句,其程序主要由小写字母组成。C语言书写格式自由,它压缩了其他高级语言中的冗余的部分。C语言是众多语言中最简洁、紧凑、灵活的语言,只有32个保留关键字(reserved keywords),使变量、函数命名有更多弹性。

(4)C语言功能齐全,具有各种各样的数据类型,并且引入了指针概念,可使程序效率更高,而且计算功能、逻辑判断功能也比较强大。C语言中运算符和数据结构非常丰富,共有34种运算符,可以实现在其他高级语言中难以实现的功能。

C语言中的数据类型有整型、实型、字符型、数组类型、指针类型和结构体类型等,能够用来实现非常复杂的数据结构,如线性表、链表、栈、队列、树和图等。部分的变量类型可以转换,例如整型和字符型变量。

(5)C语言是结构式语言,结构式语言的显著特点是代码及数据的分隔,即程序的各个部分除了必要的信息交流外彼此独立,这称为“低耦合度”。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。

C语言是以函数形式提供给用户的,这些函数可被用户方便地调用,并具有多种循环、条件语句控制程序流程,从而使程序完全结构化。同时在函数调用中,C语言传递参数可以是值传递(pass by value),也可以是通过值传递指针(a pointer passed by value)。

C语言具有9个结构化的控制语句,如if-else、while、switch等,并用函数作为程序模块,是理想的结构化程序设计语言。

C语言是一个具有变量作用域(variable scope)以及递归功能的过程式语言。

(6)C语言适用范围大,适合于多种操作系统,如Windows、DOS、UNIX、Linux等,也适用于多种机型。C语言编写对需要进行硬件操作的场合,优于其他高级语言,有一些大型应用软件也是用C语言编写的。今天C语言依旧在系统编程、嵌入式编程等领域占据着统治地位。

(7)C语言应用指针可以直接进行靠近硬件的操作,但是C语言的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,它在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加了语言的复杂度,也为另一部分人所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C、C++、Java被视为同一系的语言。

(8)C语言文件由数据序列组成,可以构成二进制文件或文本文件。

(9)不同的变量类型可以用结构体(struct)组合在一起,从而可以构造复杂的数据结构,如链表、树、图等。结构体也可以说是面向对象式语言里面的“对象”的雏形。

(10)预编译处理(preprocessor)让C语言的编译更具有弹性,更便于移植,也更加能够适应多种环境。

(11)C语言语法限制不太严格,如对数组下标越界不做检查,各种类型的变量可以通用等。这是优点,自由灵活;但也是缺点,容易引发意想不到的错误。

(12)允许直接访问物理内存,能实现对二进制位的操作。有了这项功能,C语言在能力和效率上与汇编语言不相上下,但比汇编语言要好理解和好使用得多。

(13)C语言生成的目标代码质量高,只比汇编语言生成的代码效率低20%左右。在一些追求效率的低层操作和对响应时间要求非常高的应用场合,C语言一直是不二的选择。在嵌入式系统方面,C语言更是大显身手,无人能够替代。

(14)C程序的可移植性好,基本上不用修改就可用于其他型号的计算机。

(15)C语言是少见的,不专属于任何组织或机构的语言,使用它很少能够牵扯到知识产权问题,因此应用非常广泛。

C语言由美国国家标准协会制定语言标准,不但在Windows操作系统下能够运行,在UNIX、Linux和Mac OS等操作系统上也能流畅运行。C语言可以说是UNIX操作系统的母语,近年来在Linux操作系统上更是广泛流行。而苹果公司在C语言的基础上,开发出了Objective-C,后来则更上一层楼,在Objective-C的基础上开发出Swift语言,Swift成为Mac OS以及IOS上最为耀眼的开发明星。

(16)C语言有很多极其优秀的实现工具,即IDE(集成开发环境)。语言本身只是一种规范,必须有编译器才可以实现它。用高级语言书写的程序代码最终要变成可执行文件,无论是在书写的过程中,还是最后编译成可执行文件,都需要一个简便而高效的工具来支持。这样的工具就称为IDE,比如Visual C++6.0、Visual C++2010 Express、Visual studio 2012(简称Vs2012),C++Builder、Code::Blocks、CodeLite等。

(17)C语言具有强大的绘图能力,也有强大的数据处理能力,因此在编写系统软件、二维、三维图形和动画软件、数值计算、游戏引擎等方面拥有不可替代的优势。

1.2.2 C语言的优点

(1)简洁紧凑、灵活方便。

C语言一共只有32个关键字,9种控制语句,其程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

(2)运算符丰富。

C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。

(3)数据类型丰富。

C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据结构的运算,并引入了指针概念,使程序效率更高。

(4)表达方式灵活实用。

C语言提供多种运算符和表达值的方法,对问题的表达可通过多种途径进行,其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如整型量与字符型数据及逻辑型数据可以通用等。

(5)允许直接访问物理地址,对硬件进行操作。

由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多特性。

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

C语言描述问题比汇编语言迅速,工作量小,可读性好,易于调试、修改和移植,而它的代码质量与汇编语言相当。

(7)可移植性好。

C语言在不同机器上的编译程序中有86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。

(8)表达力强。

C语言有丰富的数据结构和运算符,包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现某些难度极大的运算。

C语言能直接访问硬件的物理地址,能进行位(bit)操作,兼有高级语言和低级语言的许多优点。它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。另外C语言具有强大的图形功能,支持多种显示器和驱动器,且计算功能、逻辑判断功能强大。

1.2.3 C语言的缺点

(1)C语言的缺点主要表现在数据的封装性上,即算法和数据没有彻底分离。这一点使得C语言在数据的安全性上有很大缺陷,这也是C和C++的一大区别。当然,C和C++从本质上来讲,是两个不同的语言,C语言面向过程,是结体化和程序设计语言;而C++面向对象,是可视化的面向对象的程序设计语言。

(2)C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度来说,C语言比其他高级语言更难掌握,尤其是指针的使用。从某种角度讲,这些缺点不是C语言不好,而是低素质的程序员用不好C语言,就会出现很多问题,甚至是很危险的问题。也就是说,C语言对使用者的要求更高,要求程序员对计算机硬件底层了解更多一些,对程序设计更熟练一些。因此,业界曾经流行过一句话:“真正的程序员用C,聪明的程序员用Delphi”。这句话说得很对,要用好C语言,就要成为一个真正的程序员,即高素质的程序员,这样才能高效率地用好C语言。

(3)C语言最大的缺陷在于要求程序员自己去做内存管理,程序员要用C语言去处理复杂的数据结构,因此程序员大部分的时间都花在了这上面,并且滋生了无数bug。这是最令人头疼的一点,由此使用C语言的程序员要对硬件底层了解地相对要多一些。

1.2.4 C语言的现状和前景

从学习的角度讲,C语言是基础性的语言,但其强大的优势始终无法被超越。目前许多流行的开发语言几乎都和C语言有着千丝万缕的关系,学好了C语言就等于掌握了几种编程语言,因此建议好好学习C语言。

与C++、Java、C#相比,C语言其实很简单,但却非常重要。因为它是C++、Java、C#的基础,不把C语言基础打牢固,就很难成为高手。

从应用的角度来看,尽管目前是面向对象程序设计方法霸占天下的时代,C语言属于结构化语言,似乎是过时了。但实际不然,面向对象程序设计主要用于应用系统的开发,而C语言是开发系统软件的不二利器,面向对象程序设计的语言始终无法替代。尤其在Linux操作系统上,C语言大展身手,不但没有销声匿迹,反而大放异彩。

在嵌入式系统、人工智能、模式识别技术等领域,C语言更是大展身手,焕发出强大的生命力。

说起C语言,还不得不提起另外一种。1980年,Brad Cox(布莱德·考克斯)在其公司Stepstone发明了Objective-C。Objective-C是一种扩充了的C语言,并且是一种面向对象的编程语言,它开始主要用于Mac OS系统,后来得益于iPhone的广泛流行而广泛流行起来,因为编写iPhone应用程序的主要编程语言就是Objective-C。

苹果公司在Objective-C的基础上,又发展出了Swift。2014年,苹果公司发布了新的开发语言Swift,Swift可以说是一种全新的语言,它结合了C语言和Objective-C的优点,但却不受C语言兼容性的限制。Swift采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift是基于成熟而且倍受喜爱的Cocoa和Cocoa Touch框架,Cocoa是苹果公司的面向对象开发框架,而Cocoa Touch由苹果公司提供的软件开发api类库,用于开发iPhone上的软件。Swift的诞生将重新定义软件开发,并且掀起了人们重新认识C语言的新一轮高潮。

从使用的经验来看,要学好、用好C语言,需要打好两个基础,一是了解计算机硬件结构,在结合硬件设备的基础上最好能再了解一下汇编语言,当然只需要简单了解即可,这将会对C语言的理解、使用起到不可估量的作用。从这个角度讲,C语言可谓是对汇编语言的“封装”和“改造”,因此要想深入理解C语言,就要先了解汇编语言。二是应该掌握数据结构和算法,包括链表、队列、栈、树和图等数据结构以及查找、排序等常用算法。从这方面说,学好、用好C语言似乎比起其他高级语言要难一些。

有人讲,编程牵扯到三个环节:语言、环境和应用。语言就是指掌握某种语言本身,比如熟练掌握C语言。但光掌握语言是否就能编好程序呢,显然不行,还需要一样武器,即IDE。一个好的IDE,应该有自动缩进、高亮标记、上下文提示、自动完成函数语句、自动标记匹配等功能,有了这些会使开发变得简单轻松。当然编译、连接和调试的强大功能就不用说了。第三个环节就是应用了,包括需求分析、业务流程描述和最终算法实现等内容。如果应用环节的需求和问题吃不透,那么再好的语言和再强大的IDE都是无用的,照样编不出来好程序来。那么想要学好C语言,这三个方面也是缺一不可的。