C语言学习日记第一篇(C语言概述)

C语言学习日记第一篇——C语言概述

一,C语言概述

如果要说目前什么语言最为火热,人们可能会说Python、Android,学好这些语言可以让你很轻松的找到一份收入不菲的工作,过上舒适的生活。但是,小编觉得,如果要说什么语言最重要,还是得回到C语言上来。我们平时所谈论到的所有语言的发展都与这门语言或多或少的有联系,可以毫不夸张的说,C语言奠定了现代计算机编程语言的基础。直到今天,它仍然是我们从事编程行业相关人员的入门必修课。
C语言最初是在B语言的基础上开发出来的。1972年,当时在贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普森(Ken Thompson)在开发UNIX系统时,设计了C语言。它开发的初衷是将其作为程序员使用的一种编程工具,成为真正有用的语言。
对于一名开发者而言,B语言过于简单,功能有限,不能满足持续发展的需求,在此基础上,诞生了C语言,它的命名是取自于BCPL语言第二个字母。C语言保持了B语言和BCPL语言简练的特点,弥补了它们在功能不足上的缺陷。

二,C语言的特点

既然C语言如此重要,那么它和其他的语言相,到底有什么样的特点呢?到底是什么样的一门语言能够几乎所有编程开发的基础呢?

1.运行高效

C语言程序开发时,结构较为紧凑,运行速度比较快。另外,C语言具有汇编语言的微调控能力(这是目前其他很多语言都不具备的特点),即能对硬件进行一些操作,通过具体使用一些微调程序能够获得高效的运行速度。

2.可移植

如果一名开发人员想把UNIX系统中的程序移植到IBM大型机上面,他所要面临的难度不亚于横跨撒哈拉大沙漠(当然这种工作通常是一个Team来完成,但仍然工作量很大)。使用过以前的一些语言如FORTRAN的开发人员会知道,移植程序是一件极其麻烦的事情。
然而,C语言的诞生为广大的开发人员送去了福音,通常来说,在一种系统上开发设计的程序能够很轻松的在另一种系统上运行,因为在他们的系统中都带有C语言的编译器。从我们的个人计算机,到工作站,再到超级计算机,绝大部分都有C语言编译器。因此,从事C语言开发的人员很少担心移植性的问题,这是C语言应用广泛的一个极其重要的原因。

3.面向过程语言

C语言是一种面向过程的语言,它着重于程序设计的算法、语言的使用,例如主函数中只写出调用的函数,而所调用的函数是在别处声明和定义的。这种面向过程的开发方式使得程序层次清晰,便于使用、维护以及调试。

C语言有许多的优点,但也有不少的缺点。总体来说,优点远多于缺点,这里不做讨论。
值得注意的是,C语言面向过程的这一特点被认为是可以继续完善的,因此在后来也诞生了面向对象的C++

三,C语言的组成

C语言的组成,不十分严谨的说,就是数据和程序两个部分。我们在上面进行的开发就是如何写出能够良好处理数据的程序。这里所说的数据,包括数字、符号,还包括一些从实际问题中抽象出来的信息。

1.数据

C语言为开发人员提供了许多供选择的数据类型,如int、short、long、unsigned、char、float、double、bool,还可以自己根据需求重新定义特有的数据类型,不同的数据类型有不同的特点,包括定义的方式、内部存储的位数等,开发人员可以根据实际情况进行选择。
但是,如果只对这些基本类型进行操作的话,是无法支撑我们现有美好生活的,你可能就无法现在坐在电脑前看到小编我写的文章了。在实际应用中,我们往往需要处理大量的数据,这时需要关注的就不再是某一种数据类型,而是多种数据类型的组合,对它这一整体进行操作。
如果你是一名学过数据结构的编程爱好者,你就会知道,在基本的数据类型上,我们通过组合、拼接等等的方式定义了如线性表、数组、队列、栈、树、图等多种数据的构造形式,这些构造出来的形式我们称之为数据结构。如果把数据结构比作一张网,那么基础数据类型就是网当中的结点。通常来说,我们处理的数据都会是数据结构中的某一类。

2.程序

对一个学者而言,日常饮食是生理食粮,而读书则是精神食粮。如果我们将C语言比作一次丰盛的晚宴的话,那么C语言的数据应该是餐桌上的美味佳肴,能否吃到固然很重要,但如何能高质量的享受它才是我们应有的追求。
为了能够处理如此多类型的数据,C语言定义了许多类别的处理方式,包括了能进行数据之间交互的运算符、减少代码量的循环语句、控制程序运行的分支跳转语句、面向人机交互的输入输出语句、机器内部的读写语句等。通过良好的运用这些语句,我们就能够解决几乎所有现在会遇到的问题。

说起程序,就不得不提函数这个概念了。函数是什么?计算机当中所说的函数又是什么?这个词对于初学者而言会比较陌生。我们先回顾一下过去学习的数学知识,比如 f(x) = x^2 + x, 这显然是一个二次函数,并且有一个一次项,当给f(x)中的x一个具体的数值的时候,会进行右侧x^2 + x的计算得到结果,这个过程叫做赋值。在计算机当中也用到了赋值这种说法,不过从计算机函数的角度上来看,用参数传递会更显专业。

在计算机内,函数也类似于数学公式那样,完成特定的任务,比如你可以写一个Sum()函数,表示做加法运算,你也可以写一个Search()函数,表示寻找什么东西,这些都是由开发人员自己定义的。对于有些函数而言,你只需要它运行即可,而对于有些函数,你需要提前给它一个值,它才能实现,如上面的二次函数,如果不给它一个确定的X值,那么它就只表示一种数学关系。另外,还有的函数需要计算完毕之后返回值。

与数学当中的函数类似,计算机函数是这样一个东西,它描述了一组动作或一种关系,它能够接受外部的输入(可能没有),执行相应的动作,得到相应的结果(可能不返回)。事实上,C语言定义的所有语句都是函数,只不过它们是预先被写入到C语言的库当中,当我们需要使用时,只需要在库中进行调用即可。如果你想成为一个合格的C的开发人员,一定要熟练的掌握C语言中各个函数的特点,在此基础上进行拓展。

如果你既能够将实际中的问题抽象化,变成我们有逻辑的数据结构,还能够灵活的运用各类函数对他们进行处理,那么恭喜你,在C语言开发方面,你已经入门了。

四,C预处理和C库

1.C预处理

在前面,我们简单的阐述了C语言的组成,它是由数据和程序构成的。其实,这种说法不太严谨,如果更细一些的话,应该说C主体部分或者说开发人员需要关注的部分,是由数据和程序构成的,还有一些部分是C语言设计者完成的,粗略的说就是预处理操作,当然,我们是可以根据实际情况重新定义预处理的方式的。

有一句俗话这样说,磨刀不误砍柴工,先将镰刀磨快,这样砍柴起来就很方便。可以这样作比较,数据部分是柴火,程序是镰刀,而预处理操作则是磨刀石。通过一些合理的预处理操作,将会使得你的程序开发事半功倍。

说起C预处理操作,相信了解过C语言的人会知道,在我们最开始写“Hello World”这个程序时,我们在第一行会写到
#incldue<stdio.h>

这个是什么呢?这就是我们第一次会接触到的预处理操作,#include表示将stdio.h这个头文件加入到我们所写程序的编译环节之中,我们就能够调用这个头文件下的函数,这里面包括了输入输出等函数的定义,这是不是很方便?不需要自己写,直接调用,简直就是人家把面包烤熟了我们直接拿来吃!!对一个编程人员来说,这是一种相当惬意的事情,不过小编还是不推荐大家在日常生活当中这么偷懒了。

除了文件包含预处理指令以外,还有一个很重要的概念,它叫做宏。说起宏,小编我就要说一些题外话了。我自己在C语言方面有宏观的了解,也仔细学过,但没有到精通的级别。我曾经参加过电子设计大赛,参赛的时候借用了3D打印机内Marlin固件的代码,在这个基础上进行了一些特有函数的定义,顺利完成了题目要求,也荣幸的获得了一等奖的荣誉。不过我这里不是强调获奖,而是我所借用的Marlin固件的代码,绝大部分都是用宏来定义的!!!宏是什么?宏是C语言内的一类重要预处理对象!!是极其强大的一种控制程序的手段。

例如你写到
1 #ifndef XXX
2   #define XXX
3 #else
4   #define YYY
5 #endif

上面表达的是的是如果你没有定义XXX,则定义XXX,否则定义YYY。这似乎和程序当中的判断选择有些类似,但你要明白,这不仅仅是一个定义那么简单,这是在所有程序运行之前进行的处理,可以理解为你吃饭之前要先拿筷子、刀叉一样,就算你不喜欢用餐具,小编我想你总得用手吧!!!你可能有疑问,既然是预先处理,我自己确认自己都没写,用这条语句岂不是显得多余?其实并非如此,你要是写个几十行的代码,显然很容易理清楚,但要是开发一个应用级别的软件呢?需要写数万行的代码呢?你难道还得一个一个文件的去找吗?另外,通过这种宏定义,你还能控制什么函数执行,什么函数不执行,如何跳转,如何选择。小编原来对这种宏定义并不十分了解,觉得无非就是个提前定义个变量、函数什么的,但自从看到Marlin固件的代码之后,小编觉得自己真的是井底之蛙,在C语言的道路上还只是刚刚启程。

2.C库

前面我们提到,C的文件包含预处理指令#include,那么我们就必须要知道它包含了什么内容,例如上面的stdio.h,就包含了输入输出等函数,另外还有许多库供开发人员选择,如string.h、math.h、stdlib.h等等,这些都是集成在开发平台上面的,我们直接用就可以了。可以说,C语言的头文件库为我们省去了很多的麻烦,方便了我们进行开发和创造!!

猜你喜欢

转载自blog.csdn.net/weixin_42877471/article/details/83719227