浅谈对C语言的认识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈对C语言的认识
摘要:C语言作为一种通用的命令式计算机编程语言,提供了有效利用汇编语言的途径,使低级的机器指令能以简易的方式进行编译。随着C语言的国际标准化,它已经成为有史以来使用最广泛的编程语言之一,对计算机编程领域产生了不可估量的影响。计算机编程爱好者和专业人士都应当学习C语言,为学习高级编程语言奠定坚实的编程基础。本文从C语言的语法特点、数据结构、应用以及衍生等方面进行简要介绍,旨在提供入门知识的浅显参考。
关键字:C语言;语法特点;数据结构
一、C语言的语法特点
1. 字符集
C语言的基本字符集包括基本拉丁字母小写和大写字母(a-z,A-Z)、十进制数字(0-9)、特殊图形字符(!@#$%^&*()[]{};:’”,<.>/?`~\|)以及空白字符(空格、水平制表符、垂直制表符、换页符、换行符)。虽然换行符只是表示文本行的结尾,实际并不需要与某个字符对应,但是为了方便,C语言中它仍然被认为是一个字符。字符串文字使得C语言可以进行多字节字符编码,并且C标准库中自带字符串操作函数。C语言的可执行字符集包含相同的字符,以及警报、退格和回车等。随着C语言标准的不断修订,对扩展字符集的支持逐渐在增加。
2. 关键字
C语言中定义了一些特殊的关键字,只能用于C语言编译本身使用,而不能用于如命名之类的操作。在C语言标准C89中有32个常见关键字,如double、int、Char等数据型关键字,以及if、else、break、Continue等控制型关键字。后来的C99和C11标准又分别提出了5个和7个关键字,如_Bool、_Alignas等。大多数最新的关键字都是以下划线开头,后面跟着一个大写字母。当C开始支持这些扩展关键字时,以前留存的C程序代码没有使用过这些关键字,因此不会受到任何影响,在无需任何改动的情况下仍可继续使用。
3. 运算符
运算符是语句表达式中,用于指定执行该表达式时要执行的具体操作。C语言支持相当多的运算符,如加(+)、减(-)、乘(*)、除(/)、余(%)等算术符,赋值符(=)、大于(>)、小于(<)、不大于(<=)、不小于(>=)等关系符。C语言遵循Fortran和PL/I的语言习惯,用等于号(=)来表示赋值,但与ALGOL 等语言不同,C使用(==)来检验是否相等。如果混淆这两个运算符(=和==),很容易导致意外的错误,并且在很多情况下不会产生错误信息,例如条件表达式if (a==b+1)和if (a=b+1)都可以编译通过,但运行结果是截然不同的。
二、C语言的数据结构
C语言中的数据是静态的,有各种大小的整数类型(有符号和无符号)、浮点数和枚举类型,以及派生类型,包括数组、指针等。
1. 指针
C语言支持使用指针,这是一种在内存中记录对象或函数的地址或地址引用的数据类型。指针可以被间接用于访问存储在指向地址的数据,或调用指向函数,通过赋值或指针算术即可操作指针。指针在C语言中用途繁多,例如文本字符串通常使用指针指向字符数组,动态内存分配使用指针执行,许多如树这样的数据类型通常采用指针链接在一起的方式进行动态分配结构对象。指针的使用需格外小心,因为它们通常是未选中的,可以使指针变量指向任意位置,这可能会导致意外的错误。所幸的是,C语言允许指针类型之间进行操作和转换,能够有效地将指针指向安全的地方。
2. 数组
C语言中的数组类型在编译时一般大小都是固定的,但在运行时使用标准库的malloC函数可以分配一块任意大小的内存块,也可视为数组。由于数组实际上是通过指针访问的,所以数组访问通常不会根据数组的大小进行检查。因此,如若代码编写不仔细,数组边界违规将会时常发生,并会导致各种严重后果,如非法内存访问、数据损坏、缓冲区溢出以及运行异常。C语言没有对多维数组做特别的规定,而是依靠递归来命名数组,进而为数值算法中的矩阵存储提供了途径。但是,由于数组仅作为指针进行传递,数组的边界必须是已知的固定值,不能使用双重索引访问多维数组。
3. 数组和指针的可交换性
C语言的大多数语句表达式中,数组的名称会自动转换成指向数组第一个元素的指针。这意味着一个数组在被命名为一个函数的参数时不会被完全传递复制,而只是它的第一个元素的地址被传递。因此,虽然C语言中函数的调用使用按值传递,但数组实际上是通过指针引用进行传递的。尽管数组和指针变量之间有明显的等价关系,但它们还是有区别的。虽然数组的名称在大多数语句表达式中被转换成指向第一个元素的指针,但是这个指针本身并不占用任何存储空间。另外,数组名称的地址是一个常量,这与指针变量是不同的,所以数组本身的指向无法更改,不可能将新地址分配给数组名称。
三、C语言的应用
1. 系统编程
C语言擅长编写小而快的程序,易与汇编语言结合,因此被广泛应用于系统编程,以实现操作系统和嵌入式系统的应用程序。C语言简约的语法、灵活的操作、面向底层、便于移植等特性,使其成为了系统开发的首选,例如Window、Linux、FreeBSD等操作系统都是基于C语言开发的。C语言代码的可移植性很强,大多场景下都能派上用场,且在需要时可以通过C语言调用系统特定的代码来访问特定的硬件地址,并执行类型双关匹配外部施加的接口要求,以降低系统运行时的资源消耗。
2. 网页编程
通过利用CGI,C语言可以作为服务器和浏览器之间的信息网关,用于开发网页程序。基于CGI的应用程序能够通过数据库API从数据库服务器等外部数据
源中获取数据,从而实现与浏览器的交互。几乎所有服务器都支持CGI,不仅C 语言,C++、VB和Delphi等编程语言都能编写CGI。有些程序员在做网页编程时选择C语言而不选解释型语言,看中的是C语言的速度、稳定性及其通用型。由于时代的发展,用CGI编写网页程序已被PHP/ASP/JSP等动态页面技术取代。
3. 媒介语言
C语言有时可用作其他编程语言实现媒介语言,为了方便与可移植,通常使用C语言作为媒介语言,不需要额外的机器专用代码生成器。C语言有一些功能,如位于初始化程序列表的行号预处理指令和可选的多余逗号,支持编译生成的代码。C语言的广泛通用性和执行效率使其很多时候成为一个编译器,库和其他编程语言的解释器通常以C语言实现,例如Python、Perl和PHP的参考实现全部都是用C语言编写。C语言能高效实现算法和数据结构的创建,在计算密集型程序中很有用,MathematiCa和MATLAB中也有C语言编写的部分。
四、C语言的衍生
1. 语法上的延伸
C对C#,D,Go,Java,JavaSCript,Limbo,LPC,Perl,PHP,Python和Unix 的C shell等许多后来的语言都有直接和间接的影响。最普遍的影响是语法上的,所有被提到的语言,都是将语句和(或多或少可识别的)C的表达语法、类型系统、数据模型、大规模程序结构(它们与C的语言有所不同)结合起来。存在几个C或近C解释器,包括Ch和CINT,它们也可用于脚本编写。
2. C++和ObjeCtive-C
当面向对象的语言变得流行时,C++和ObjeCtive-C是C语言提供面向对象功能的两种不同扩展。这两种语言最初都是作为源到源编译器实现的,也就是源代码被翻译成C语言,然后用C编译器编译。C++提供了一种使用类C语法的面向对象功能,增加了更多的类型、范围界定以及其他在面向对象编程中有用的工具,并允许利用模板进行通用编程。C++几乎是C的超集,目前的C++支持大多数的C 语言编程。ObjeCtive-C最初是C之上的一层,且是C的严格超集,允许使用混合动态、静态类型的方式进行面向对象编程。ObjeCtive-C从C和Smalltalk中派生出它自己的语法,其中涉及的预处理、表达式、函数声明和函数调用等语法从C继承而来,而面向对象特性的语法来自Smalltalk。