欧易

欧易(OKX)

国内用户最喜爱的合约交易所

火币

火币(HTX )

全球知名的比特币交易所

币安

币安(Binance)

全球用户最多的交易所

深度解析:C语言概述

2022-10-09 17:33:52 402

摘要:什么是C语言?C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言起源C语言是贝尔实验室的Dennis Ritchie于...

什么是C语言?

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

C语言起源

C语言是贝尔实验室的Dennis Ritchie于1969年~1973年间创建的。美国国家标准学会(American national standards institute,ANSI)在1989年颁布了ANSI C的标准,后来语言的标准化成了国际标准化组织(International Standards Organization,ISO)的责任。这些标准定义了C语言和一系列函数库,即所谓的C标准库。Kernighan和 Ritchie在他们的经典著作中描述了ANSI C,这本著作被人们满怀感情地称为“K8R”。用Ritchie的话来说,C语言是“古怪的、有缺陷的,但同时也是一个巨大的成功”。为什么会成功呢?

C语言与Unⅸ操作系统关系密切。

C从一开始就是作为一种用于Unix系统的程序语言开发出来的。大部分Unix内核(操作系统的核心部分),以及所有支撑工具和函数库都是用C语言编写的。20世纪70年代后期到80年代初期,Unix风行于高等院校,许多人开始接触C语言并喜欢上它。因为Unix几乎全部是用C编写的,它可以很方便地移植到新的机器上,这种特点为C和Unix赢得了更为广泛的支持。

C语言小而简单

C语言的设计是由一个人而非一个协会掌控的,因此这是一个简洁明了、没有什么冗赘的设计。K&R这本书用大量的例子和练习描述了完整的C语言及其标准库,而全书不过261页。C语言的简单使它相对而言易于学习,也易于移植到不同的计算机上。

C语言是为实践目的设计的。C语言是设计用来实现Unix操作系统的。后来其他人发现能够用这门语言无障碍地编写他们想要的程序。

C语言是系统级编程的首选,同时它也非常适用于应用级程序的编写。然而,它也并非适用于所有的程序员和所有的情况。C语言的指针是造成程序员困惑和程序错误的一个常见原因。同时,C语言还缺乏对非常有用的抽象的显式支持,例如类、对象和异常,像C++和Java这样针对应用级程序的新程序语言解决了这些问题。

C语言历史

60年代后期对于贝尔电话实验室是一个混乱的(turbulent)年代。公司被卷入了一个由MIT,通用电气以及贝尔实验室联合发起的有点探险性质的Multics项目。到了1969年,贝尔试验的管理层以及研究人员们开始感觉到Multics项目如果要实现,将会拖到很晚,并且将会付出高昂的代价。就是在GE-645 Multics机被从计划中取消之前,一个由Ken Thompson私人领导的非正式的团队就开始改变他们的目光了。

Thompson想通过他自己的设计,利用一切可以利用的办法,实现一个比较令人满意的计算机环境。这个计划包含了许多Multics的创新思想,比如清楚的把一个进程当作一个控制的轨迹,树型结构的文件系统,一个用户级的命令解释器,文本文件的简单表示,设备的通用存取。他们也剔除了一些其它的东西,比如统一的内存存取以及文件存取。最开始,Thompson以及我们其他的人推迟了Multics的另外一个创新特点,也就是以一种高级语言书写其中的大多部分。对PL/I--Multics的实现语言,我们没有作太多的尝试。我们同时使用其他的语言,包括BCPL。我们感到很遗憾,这样失去了以汇编语言书写程序的很多优点,比如书写容易,易于理解。在那个时候,我们并没有很注重可移植性,直到后来,我们才对这个发生了兴趣。

Thompson当时面对的硬件环境即使在当时也是很难懂,体系很简单的:DEC PDP-7。1968年他开始的时候是一台拥有8K 18-bit字内存并且没有任何可以使用的软件的机器。在希望使用高级语言的同时,他使用PDP-7汇编语言写了起初的UNIX系统。在最开始,他甚至就没有对PDP-7本身写程序,而是在一台GE-635机器上使用一堆GEMAP汇编器的宏。一个postprocessor(??)将这些生成为PDP-7可读的纸带(paper tape)。

这些纸带直到后来才被放到PDP-7上测试,这个时候一个简单的UNIX内核,一个编辑器,一个汇编器,一个简单的shell以及一些有用的工具已经完成了。这个时候,整个操作系统就是自支持的了:程序的书写以及测试再也不需要求助于纸带了,整个系统的开发就可以在PDP-7系统本身上做了。

Thompson的汇编器在简单性上即使是对DEC的也有过之而无不及,它对表达式进行求值并改变(emit)相应的位。这个时候没有库,没有装载器,没有连接器,程序的整个源代码都送给汇编器,并且输出程序有着一个固定的名字以显示它是可以直接执行的。(这个名字是a.out,这就是解释了现在UNIX操作系统的一个特点:即使在后来系统引入了连接器以及能够明确指明另外一个名字,但是这个仍然被保留为编译后默认输出的可执行结果的名字。)

在1969年第一个UNIX系统在PDP-7上开始运行不久,Doug Mcllroy为这个新的系统创建了一门高级语言:一个McClure的TMG的实现。TMG(TransMoGrifiers)是一种用于书写编译器的语言。他使用自上而下的递归风格(stytle),并结合了上下文无关文法属性。Mcllory和Bob Morris就是使用TMG为Multics写了早期的PL/I编译器的.

面对Mcllroy重写TMG功绩的挑战,Thompson决定系统(当时还没有命名)需要一种系统语言。在快速的尝试Fortran后,它创造了一门他自己的语言,这就是B。B可以被认为是没有类型的C语言,更准确地说,它就是将BCPL压缩到8k bytes的内存,当然是经过Thompson自己的改进了的。它的名字很可能就表达了它是BCLP的压缩。另外一些不同的观点则认为B是从Bon设计而来得,这里的Bon是Thompson在做Multics项目的时候设计的一门语言,而Bon这个名字这是由他的夫人Bonnie而来得,不过有一份手册表明Bon来自于一个宗教,在这个教里面有低语的宗教规则。

C语言基本特性

1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。

2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

3、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言。

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

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

C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。

不同的变量类型可以用结构体(struct)组合在一起。

只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。

部份的变量类型可以转换,例如整型和字符型变量。

通过指针(pointer),C语言可以容易的对存储器进行低级控制。

预编译处理(preprocessor)让C语言的编译更具有弹性。

C语言的优缺点

优点

1、简洁紧凑、灵活方便

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

2、运算符丰富

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

3、数据类型丰富

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

4、表达方式灵活实用

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

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

由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。

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

C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。

7、可移植性好

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

8、表达力强

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

C语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。

它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。

另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

缺点

1、 C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。

2、 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。

C语言基本构成

数据类型

C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。

常量与变量

常量其值不可改变,符号常量名通常用大写。

变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。

数组

如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。

指针

如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。

指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。

指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。

字符串

C语言的字符串其实就是以""字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。

文件输入/输出

在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。

标准输入/输出

有三个标准输入/输出是标准I/O库预先定义的:

stdin标准输入

stdout标准输出

stderr输入输出错误

运算

C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,对此合理进行分类,找出它们与数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。

版权声明:本站所有文章皆是来自互联网,如内容侵权可以联系我们( 微信:bisheco )删除!
友情链接
币圈社群欧易官网