初识C语言

C语言的起源

        1972年,贝尔实验室的丹尼斯·里奇(Dennis Ritch) 和肯·汤普逊(Ken Thompson)在开发 UNIX 操作系统时设计了C语言。然而,C语言不完全是里奇突发奇想而来,他是在B语言(汤普逊发明)的基础上进行设计。至于B语言的起源,那是另一个故事。C 语言设计的初衷是将其作为程序员使用的一种编程工具,因此,其主要目标是成为有用的语言。

        虽然绝大多数语言都以实用为目标,但是通常也会考虑其他方面。例如,Pascal 的主要目标是为更好地学习编程原理提供扎实的基础;而 BASIC 的主要目标是开发出类似英文的语言,让不熟悉计算机的学生轻松学习编程。这些目标固然很重要,但是随着计算机的迅猛发展,它们已经不是主流语言。然而,最初为程序员设计开发的C语言,现在已成为首选的编程语言之一。

C语言的理由

优点

1.设计特性

        C是一门流行的语言,融合了计算机科学理论和实践的控制性。C语言的设计理念让用户能轻松的完成自顶向下的规划、结构化编程和模块化设计。因此,用C语言编写的程序更易懂、更可靠。

2.高效性

        C 是高效的语言。在设计上,它充分利用了当前计算机的优势,因此 C 程序相对更紧凑,而且运行速度很快。实际上,C 语言具有通常是汇编语言才具有的微调控制能力(汇编语言是为特殊的中央处理单元设计的一系列内部指令,使用助记符来表示;不同的 CPU 系列使用不同的汇编语言),可以根据具体情况微调程序以获得最大运行速度或最有效地使用内存。

3.可移植性

        C是可移植的语言。这意味着,在一种系统中编写的C程序稍作修改或不修改就能在其他系统运行。如需修改,也只需简单更改主程序头文件中的少许项即可。大部分语言都希望成为可移植语言,但是,如果经历过把 IBM PC BASIC程序转换成苹果BASIC (两者是近亲),或者在UNIX 系统中运行 IBM 大型机的FORTRAN 程字的人都知道,移植是最麻烦的事。C语言是可移植方面的佼佼者。从8位微处理器到克雷超级计算机,许多计算机体系结构都可以使用 C 编译器(C 编译器是把C代码转换成计算机内部指令的程序)。但是要注意,程序中针对特殊硬件设备(如,显示监视器)或操作系统特殊功能(如,Windows8或OSX) 编写的部分,通常是不可移植的。由于C 语言与UNIX 关系密切,UNIX 系统通常会将C编译器作为软件包的一部分。安装 Linux时,通常也会安装C编译器。供个人计算机使用的C编译器很多,运行各种版本的Windows 和 Macintosh(即,Mac) 的PC 都能找到合适的C编译器。因此,无论是使用家庭计算机、专业工作站,还是大型机,都能找到针对特定系统的C编译器。

4.强大而灵活

        C语言功能强大且灵活(计算机领域经常使用这两个词)。例如,功能强大且灵活的 UNIX 操作系统,大部分是用C语言写的;其他语言(如,FORTRAN、Perl、Python、Pascal、 LISP、Logo、 BASIC) 的许多编译器和解释器都是用C语言编写的。因此,在UNIX 机上使用 FORTRAN时,最终是由C程序生成最后的可执行程序。C程序可以用于解决物理学和工程学的问题,甚至可用于制作电影的动画特效。

5.面向程序员

        c语言是为了满足程序员的需求而设计的,程序员利用C 可以访问硬件、操控内存中的位。C 语言有丰富的运算符,能让程序员简洁地表达自己的意图。C 语言不像 Pascal 甚至是C++那么严格。这样的灵活性既是优点也是缺点。优点是,许多任务用C来处理都非常简洁(如,转换数据的格式)缺点是,你可能会犯一些莫名其妙的错误,这些错误不可能在其他语言中出现。C 语言在提供更多自由的同时,也让使用者承担了更大的责任。

        另外,大多数C实现都有一个大型的库,包含众多有用的C函数。这些函数用于处理程序员经常需要解决的问题。

缺点

        人无完人,金无足赤。C 语言也有一些缺点。例如,前面提到的,要享受用 C 语言自由编程的乐趣,就必须承担更多的责任。特别是,C语言使用指针,而涉及指针的编程错误往往难以察觉。有句话说的好:想拥有自由就必须时刻保持警惕。

         C 语言紧凑简洁,结合了大量的运算符。正因如此,我们也可以编写出让人极其费解的代码。虽然没必要强迫自己编写晦涩的代码,但是有兴趣写写也无妨。试问,除C语言外还为哪种语言举办过年度混乱代码大赛?

        瑕不掩瑜,C语言的优点比缺点多很多。我们不想在这里多费笔墨,还是来聊聊C语言的其他话题。

C语言的应用范围

        早在 20世纪80年代,C语言就已经成为小型计算机 (UNIX 系统)使用的主流语言。从那以后,C语言的应用范围扩展到微型机(个人计算机)和大型机(庞然大物)。许多软件公司都用C语言来开发文字处理程序、电子表格、编译器和其他产品,因为用 C 语言编写的程序紧凑而高效。更重要的是,C程序很方便修改,而且移植到新型号的计算机中也没什么问题。

        无论是软件公司、经验丰富的C程序员,还是其他用户,都能从C语言中受益。越来越多的计算机用户已转而求助C语言解决一些安全问题。不一定非得是计算机专家才能使用C语言。

        20 世纪90年代,许多软件公司开始改用C+来开发大型的编程项目。C++在C语言的基础上嫁接了面向对象编程工具(面向对象编程是一门哲学,它通过对语言建模来适应问题,而不是对问题建模以道应语言)。C++几乎是C的超集,这意味着任何C程序差不多就是一个C++程序。学习C语言,也相当于学习了许多C++的知识。

        虽然这些年来 C++和JAVA 非常流行,但是C语言仍是软件业中的核心技能。在最想具备的技能中,C 语言通常位居前十。特别是,C 语言已成为嵌入式系统编程的流行语言。也就是说,越来越多的汽车、照相机、DVD 播放机和其他现代化设备的微处理器都用 C 语言进行编程。除此之外,C 语言还从长期被FORTRAN独占的科学编程领域分得一杯羹。最终,作为开发操作系统的卓越语言,C在Linux 开发中扮演着极其重要的角色。因此,在进入21世纪的第2个10年中,C语言仍然保持着强劲的势头。

        简而言之,C 语言是最重要的编程语言之一,将来也是如此。如果你想拿下一份编程的工作,被问到是否会C语言时,最好回答“是”。

使用C语言的7个步骤

        C是编译型语言。如果之前使用过编译型语言(如,Pascal 或 FORTRAN),就会很熟悉组建C 程序的几个基本步骤。但是,如果以前使用的是解释型语言(如,BASIC) 或面向图形界面语言(如,Visual Basic), 或者甚至没接触过任何编程语言,就有必要学习如何编译。别担心,这并不复杂。首先,为了让读者对编程有大概的了解,我们把编写C程序的过程分解成7个步骤。

        注意,这是理想状态。在实际的使用过程中,尤其是在较大型的项目中,可能要做一些重复的工作,根据下一个步骤的情况来调整或改进上一个步骤。

 第1步:定义程序的目标

        在动手写程序之前,要在脑中有消晰的思路。想要程序去做什么首先自己要明确自己想做什么,思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。在这一步骤中,不涉及具体的计算机语言,应该用一般术语来描述问题。

第2步:设计程序

        对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。例如,用户界面应该是怎样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?

        除此之外,还要决定在程序(还可能是铺助文件)中如何表示数据,以及用什么方法处理数据。学习C语言之初,遇到的问题都很简单,没什么可选的。但是,随着要处理的情况越来越复杂,需要决策和考虑的方面也越来越多。通常,选择一个合适的方式表示信息可以更容易地设计程序和处理数据。

        再次强调,应该用一般术语来指述问题,而不是用具体的代码。但是,你的某些决策可能取决于语言的特性。例如,在数据表示方面,C的程序员就比 Pascal的程序员有更多选择。

第3步:编写代码

        设计好程序后,就可以编写代码来实现它。也就是说,把你设计的程序翻译成C语言。这里是真正需要使用C语言的地方。可以把思路写在纸上,但是最终还是要把代码输入计算机。这个过程的机制取决于编程环境,我们稍后会详细介绍一些常见的环境。一般而言,使用文本编辑器创建源代码文件。该文件中内容就是你翻译的C语言代码。

第4步:编译

        接下来的这一步是编译源代码。再次提醒读者注意,编译的细节取决于编程的环境,我们稍后马上介绍一些常见的编程环境。现在,先从概念的角度讲解编译发生了什么事情。

        前面介绍过,编译器是把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。如前所述,不同的计算机使用不同的机器语言方案。C 编译器负责把C代码翻译成特定的机器语言。此外,C编译器还将源代码与C库(库中包含大量的标准函数供用户使用,如printf()和scanf())的代码合并成最终的程序(更精确地说,应该是由一个被称为链接器的程序来链接库函数,但是在大多数系统中,编译器运行链接器)。其结果是,生成一个用户可以运行的可执行文件,其中包含着计算机能理解的代码。

        编译器还会检查C语言程序是否有效。如果C编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另一项技能。

第5步:运行程序

        传统上,可执行文件是可运行的程序。在常见环境(包括 Windows 命令提示符模式、UNIX 终端模式和 Linux 终端模式)中运行程序要输入可执行文件的文件名,而其他环境可能要运行命令(如,在VAX中的VMS')或一些其他机制。例如,在 Windows 和 Macintosh提供的集成开发环境(IDE)中,用户可以在IDE 中通过选择菜单中的选顶或按下特殊键水编得和执行C程序。最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。

第6步:测试和调试程序

        程序能运行是个好迹象,但有时也可能会出现运行错误。接下来,应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误,计算机行话叫作bug。杳找并修复程序错误的过程叫调试。学习的过程中不可避免会犯错,学习编程也是如此。因此,当你把所学的知识应用于编程时,最好为自己会犯错做好心理准备。随着你越来越老练,你所写的程序中的错误也会越来越不易察觉。   

        将来犯错的机会很多。你可能会犯基本的设计错误,可能错误地实现了一个好想法,可能忽视了输入检查导致程序瘫痪,可能会把圆括号放错地方,可能误用C 语言或打错字,等等。把你将来犯错的地方列出来,这份错误列表应该会很长。

        看到这里你可能会有些绝望,但是情况没那么糟。现在的编译器会捕获许多错误,而且自己也可以找到编译器未发现的错误。在学习本书的过程中,我们会给读者提供一些调试的建议

第7步:维护和修改代码

        创建完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。例如,用户输入以Zz开头的姓名时程序出现错误、你想到了一个更好的解决方案、想添加一个更好的新特性,或者要修改程序使其能在不同的计算机系统中运行,等等。如果在编写程序时清楚地做了注释并采用了合理的设计方案,这些事情都很简单。

说明(对于初学者而言)

        编程并非像描述那样是一个线性的过程。有时,要在不同的步骤之间往复。例如,在写代码时发现之前的设计不切实际,或者想到了一个更好的解决方案,或者等程序运行后,想改变原来的设计思路。对程序做文字注释为今后的修改提供了方便。

        许多初学者经常忽略第1步和第2步(定义程序目标和设计程序),直接跳到第3步(编写代码)。刚开始学习时,编写的程序非常简单,完全可以在脑中构思好整个过程。即使写错了,也很容易发现。但是,随着编写的程序越来越庞大、越来越复杂,动脑不动手可不行,而且程序中隐藏的错误也越来越难找。最终,那些跳过前两个步骤的人往往浪费了更多的时间,因为他们写出的程序难看、缺乏条理、让人难以理解。要编写的程序越大越复杂,事先定义和设计程序环节的工作量就越大。

        磨刀不误砍柴工,应该养成先规划再动手编写代码的好习惯,用纸和笔记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、条理清晰。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值