首页 > C/C++语言 > C/C++基本语法 > C 语言复习与提高—I. C 语言概述
2006
12-01

C 语言复习与提高—I. C 语言概述

目录


I. C 语言概述


II. 表达式


III. 语句


IV. 数组与指针


V. 函数


VI. 编译预处理


VII. 结构体与共用体


VIII. 文件


附录:参考文献


附录:推荐读物


 


I. C 语言概述



一、C 语言概述:


C 被称为“中级语言”,它把高级语言的最佳成分与汇编语言的控制和灵活性结合起来。


C 允许对位、字节、字和地址等计算机功能中的基本成分直接操作。尽管如此,C 程序的移植性还是非常出色的。


所有的高级语言都支持数据类型的概念(一种数据类型定义了一类变量的取值范围和在其上操作的一组运算)。虽然 C 也有 5 种固定的基本数据类型,但它却不是强类型语言:C 几乎允许所有类型的转换(如:char 型和 int 型数据能够自由地混合在某一个表达式中)。同时,C 并不严格要求参数和变量之间的类型兼容(其它高级语言通常要求变量类型与接收这一变量的参数的类型相一致),C 的变量类型可以是任意的,只要它能够转换成参数的类型即可。并且,C 可以自动完成这种转换。


[注意]C 的类型检查机制较弱,这使得程序中的一些错误无法在编译时发现。


和其它高级语言不同的是,C 几乎不做运行时的错误检查(如不检查数组是否越界)。在 C 中,检查运行时的错误是程序员的责任。


C 还有一个最重要的特点:关键字非常少,C89 仅有 32 个关键字,C99 也只增加了 5 个。而其它高级语言通常都是有几倍于此的关键字。学过 VB 的朋友可以回忆一下,看看 VB 有多少个关键字。实际上,BASIC 的大多数版本的关键字都超过 100 个。


C 语言的关键字全部为小写。 –> C89 的关键字: 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


–> C99 新增加的关键字: _Bool _Complex _Imaginary inline restrict


二、C 语言的特点:


1、严格地说,C 并不完全是块结构(Block-Structured)语言,C 一般被认为是结构化语言(Structured Language),主要结构成分是函数。


从技术上讲,C 语言不是块结构语言的原因是,块结构语言允许在 procedure 中和 function 中嵌套定义其它 procedure 和 function,而 C 不允许。结构化语言的显著特征是代码和数据的封装(compartmentalization),这就可以有效地防止由于过度使用全局变量而导致的由意外的副作用在程序中引入错误。设计过 BASIC 程序的朋友对这个问题都会有深刻的体会。


现代语言一般都是结构化的,非结构化是老一代程序设计语言的标志。现在许多老语言的新版本开始引入结构化元素(如 BASIC 语言),但是,它们的缺陷是丝毫不会被减弱的,因为它们从一开始就不是按照结构化设计原则来设计的。


2、C 语言是面向程序员的语言。


计算机语言并非都是为程序员设计的,如 COBOL 和 BASIC 两种语言,就是被设计为面向非专业程序员的语言。COBOL 的设计目标不是改善程序员的环境,不是增加代码的可靠性,也不是提高编程的速度,而是使非程序员能够阅读并理解程序;而 BASIC 主要供非程序员编写计算机程序以及解决一些在实际工作中遇到的简单问题的。


而 C 是由实际工作中的程序设计人员创造、影响并测试的,最终向程序员提供了他们所期盼的一切:极少的限制、极少的强求、块结构、独立函数和简明扼要的关键字集合。C 程序能够基本达到汇编代码的效率,同时还具有良好的结构。


随着 C++ 的流行,有些人认为 C 将被淘汰,但是事实并非如此。


首先,并不是所有的程序都需要 C++ 提供的 OOP 特性。如像嵌入式系统这样的应用始终使用 C 来编写。比如说手机,手机的内存容量很小,一般的手机内存只有 4M 左右。而这 4M 还不能都给 OS 占用,还要留给电话簿、短信息、通话记录等功能使用。所以要求在设计这样的操作系统时,运行起来占用内存要尽量地少。


第二,C 与 UNIX 系统是不分家的,UNIX 系统级的应用全部用 C 来编写。这点学习过 UNIX 系统编程的朋友应该深有体会。


第三,新的 C99 标准表明,C 仍是前沿语言。


三、编译与解释:


计算机语言定义程序的属性而不是程序执行的方式。程序执行一般有两种方式:编译的(compiled)或解释的(interpreted)。尽管用任何计算机语言编写的程序都可以编译或解释,但有些语言主要是为一种执行方式而设计的。例如 C 是用来编译的,而 JAVA 是用来解释的。应当理解 C 是被明确指定为编译语言而得到优化的,C 的开发以编译为核心。


在最简单的情况下,解释程序每次读取一行用户程序的源代码,执行其中所包含的特定指令(这就是早期 BASIC 的工作方式)。在最近几年中,JAVA 对人们有很大的吸引力。在 JAVA 中,首先将源代码转换成一种“过渡”形式(即 JAVA 所谓的“编译”),然后再进行解释。为了执行用户程序,这两种情况均需要提供运行时解释程序。


编译程序一次读完全部程序,并把它转换成 Object Code。程序被编译后,源代码对程序的执行就没有任何意义了。


请记住:编译的程序永远比解释的程序运行速度慢。编译是一次性开销,而解释则每次运行时都引起额外开销。


执行速度是一个因素,OS 的访问权是另一个因素。比如 JAVA,出于安全的原因,JAVA 程序不能执行写盘和访问串口的任务;为了独立于平台,JAVA 应用程序被限制在 OS 特性的最低公共部分。而在实际工作中,C 通常可以代替汇编语言,直接对硬件进行操作。C 可以完成汇编语言的绝大部分的功能。


在这里顺便说一下 JAVA。JAVA 确实是一个重要的语言,但是它只会成为另一种语言,而不是一场所谓的“变革”。如果你需要 Internet 小程序,或者一个真正独立于平台的应用程序,那么请选择 JAVA;如果需要效率和灵活性,就选择 C 或 C++。


四、程序设计:


1、设计程序的目的:是为了解决实际工作中的问题。


2、在计算机上解决一个问题,就是把解决问题的技术和方法描述成计算机可以实现的一系列步骤,并加以实施。


计算机程序是用计算机程序设计语言所要求的规范书写出来的动作序列,它表达了程序员要求计算机执行的操作。程序是任何有目的的、预先设置好的动作序列,它是一种软件。


3、具体步骤:


(1、)分析问题,建立数学模型。


(2、)设计算法:注意在计算机上使用的算法和手写算法之间是有一定差异的。


(3、)对程序建模:以前常用流程图,现在可以使用 UML 等工具。


(4、)编写代码:这是学习计算机语言的目的。计算机语言就是为了描述计算机操作步骤而制定的一套符号标记、表达格式和语法规则。


(5、)运行程序和调试代码:代码完成后,需要进行多方测试并修改程序里的错误。测试和证实程序的正确性也是一门单独的学科。在保证程序无误后,方可投入运行。


五、C 程序的结构:


1、C 程序的内存映像: ———– 栈区 ↓ ———– ↑ 堆区 ———– 全局区 ———– 代码区 ———–


栈用来处理程序运行的一些事务:保存函数调用时的返回地址、函数的变量、局部变量以及 CPU 的当前状态。 堆是一个自由存储空间,由 C 语言的动态分配函数来使用它。


2、编译 C 程序:程序设计 –> 程序编译 –> 程序与所需的库函数链接。 [注意]编译程序只接受输入的标准文本文件。用某些字处理软件产生的文件,若其中包含控制码和非打印字符,编译程序将予以拒绝。


3、库(library)和链接(link): 在 C 语言的定义中,没有提供任何实施 I/O 操作、高级数学计算或字符处理的关键字。大多数 C 程序都要调用 C 标准库中的函数。


C 编译程序都带有标准库,来完成最常见的任务。标准 C 定义了所有编译程序支持的函数的最小集合。在 C 的某些实现中,函数库以单一的大文件形式出现;在另一些实现中,函数库以若干小文件的形式出现,提高了效率和实用性。


编程所需的许多函数都在标准库中,作为构成程序的基本构件。程序员自己编写并反复使用的函数,也可以放在一个库中。


4、分别编译: 随着程序长度的增加,编译时间也将增加。C 允许把一个程序分解为若干块,放在若干个文件中,每个文件可单独编译。一旦所有的文件编译成功,就可以把它们与库中的函数链接,形成完整的目标代码。


分别编译的优点是:当一个文件中的代码改变后,不必重新编译全部程序。这在做比较庞大的项目时,能够节省大量的时间。分别编译还允许多个程序在一个项目上轻松地一起工作,并且为大型项目的代码组织提供了手段。


[一般原则]编程时,主程序一定要简洁,可以只有一个 main(),其它函数按功能分类,放到不同的文件中。如:


文件 func.c 中: 文件 func.h 中: #include “func.h” void func1(); /* 声明 */ void func1() { }


主程序中: #include “func.h”


5、在程序正确的前提下,可读性、易维护性和可移植性是程序设计的首要目标:


- 可读:使用良好的书写风格和易懂的语句编写代码。


- 易维护:当业务需求发生变化时,不需要太多的开销就能够扩展和增强程序的功能。


- 可移植:编写的程序在各种计算机平台(CPU 和 OS)上都能够正常运行,并且运行结果一致。


六、书写 C 代码的两种风格以及 C 的注释:


1、UNIX 风格:左大括号与语句在同一行。如: if (i) { /* 处理 */ } else { /* 处理 */ }


2、Windows 风格:左大括号与右大括号对齐。如: if (i) { /* 处理 */ } else { /* 处理 */ }


3、注释:


(1、)C89 规定的注释方式:/* 注释内容 */,不允许嵌套。


(2、)C99 和 C++ 规定了单行注释方式://。单行注释可以嵌套在多行注释中,如: /* Nous somme le 04/03-2005. // Vendredi. */


4、在 C++ 环境下编写 C 代码:


现在很多人使用 C++ 开发环境(如 Microsoft Visual C++)来编写 C 代码。首先要注意,在 VC 下创建 C 程序时,生成 Win32 Console Application 的空白工程。


由于 C++ 兼容整个 ANSI C 89,所以可以使用 C++ 编译器来编译 C 程序。但是有一点需要注意,C++ 头文件的包含中用到了命名空间(Name Space)的概念。


98 年以前,C++ 包含头文件的方式与 C 一致: #include <iostream.h>


98 年以后的流行方式是使用名字空间: #include <iostream> using namespace std;


在 C++ 环境中编写 C 的代码时,可以使用两种方式来包含头文件:第一种即 C 语言的方式(#include <stdio.h>);第二种可以使用 C++ 的方式,在头文件名前加 c,并去掉后面的 .h: #include <cstdio> /* C++ 标准 */ using namespace std; /* 在使用 C++ 标准中 C 的头文件时应注意,C 函数全部放在 namespace std 中 */


关于命名空间的概念,学习过面向对象技术以后就会有一个初步了解了。这里只是讲了一个固定的格式,大家在 C++ 环境中编写 C 代码时,如果想让自己的程序看起来更专业些,就可以使用这个方式来书写。


5、自己在编写代码时,应记下出错的地方,争取以后避免,并记下编程技巧,总结知识点。


七、关于包含 <stdio.h> 头文件的问题:


在很多教程中,仅使用 scanf() 和 printf() 的程序里很多都没有包含 <stdio.h>。这种做法不会引起什么错误,但是按照编程规范和习惯来说,一般都是要加上的。并且,对函数的声明将促使 C 语言进行函数的匹配检查,从而发现函数调用上的错误。


C 语言复习与提高—I. C 语言概述》有 4 条评论

  1. ~迷糊~ 说:

    学习下 谢谢LG

  2. fireblue 说:

    学习!

留下一个回复