代码抽象与泛类型初探之C语

1 写在前面的话

对于很多人来说C语言,或许是在学校学习时那一个蓝色屏幕的TC,更有甚者会人有把VC++中所使用的C++语言同C语言混为一谈。在我们学习时常听到这样的说法``C是C++的一个子集'',这个说法从语法层面来看的确是不错的,但是往往很多人却因这句话产生了一个错觉,那就是``C++比C更优秀''。但实际上,C和C++各有其有点和缺陷,不过就我看来,C语言要比C++更``平衡''一些。然而,我些这篇文章的目的也很简单,只是希望各位能从中感受到C的简约与灵活

 

2 编程中数学抽象的应用

在面向对象编程中,我们常常被灌输一个概念,那就是OOP是对现实的抽象。正因为这样,我们常常习惯性的把C看成是不能进行抽象编程的,并冠以各种落后的帽子。现在,让我们一步步走近C,看看C给我们的魅力。

 

2.1 传统意义上的C代码

我们从一个传统的C代码开始,我们将定义一个函数,让其从某个数开始逐个相加,直到某个数结束。

对于有一定基础的人而言,上面的代码并不难理解。Sum函数从b开始以s为基数逐一加到e。

 

下面我们根据以上的代码,实现一些特殊的功能,比如实现多项式相加。

 

从以上两个代码,我们可以看出这两段数学式类似的C程序代码也存在一定的相似性。从形式上看,代码只是在for循环中存在不同,其他地方基本类似。

 

2.2 将函数作为参数

在我们刚开始学习C语言时,我们最头疼但也是C语言最精华的东西或许就是``指针''了。可以说对于许多学习C语言的人来说,指针是他们一开始很难理解的东西,但是随着使用C语言的深入,他们发现它是C语言中最重要的概念之一。

 

现在,让我们看看如何把函数作为参数传给函数。以下的代码将函数作为参数f传给函数s,并让s中调用所传入的函数f。

上面的代码中,我们一开始定义了一个函数指针类型。然后,在调用s函数的时候将函数f以指针的形式传给了函数s。现在各位知道为什么我要在一开始说指针了吧。

 

我们现在来看看上一节中所使用的求和。从求和的数学式中,我们可以看到如下几个决定求和行为的参数。

  • i起始的数值,整个求和的计数将从b开始。
  • i结束的数值,求和函数将一直计数到n结束。
  • f 这是一个函数,改变这个函数将改变整个求和行为的功能。
  • a[i]是f的系数

接下来,我们来看看如果把这个数学符号变成一个C语言的程序代码。

上面这段代码,我们将数学表达式中的f表达成了一个函数指针。这样一来,我们今后只需要传入不同的函数f给SumGen,就能改变SumGen的功能了。接下来我们将用SumGen函数实现上一节中SumPoly的功能,其代码如下所示。

 

也许有些人看到这里或许会觉得我是不是有些画蛇添足,直接像SumPoly那样定义不行么?但是我们都知道一个编程原则,就是``代码重用''。这不是纸上谈兵也不只有在C++中才有。这样做之后,就可以避免重复的输入求和函数的结构。随之而来的另一个优势是,当只要对SumGen这个函数进行算法优化,就能将这个优化应用于各个利用SumGen定义的函数,比如这里的SumPow。如果用OOP的思想来看,SumGen就是一个超类,而SumGenPoly就是SumGen的子类。这种函数的抽象将带来众多的好处。

 

3 C语言中类似模板概念的实现

熟悉C++的人或许对C++中的模板并不陌生,他主要的作用就是将编程结构相同但操作的数据类型不同的函数用模板的方式定义。当然C语言中是没有模板这个东西的,但是没有并不代表不能实现。

 

3.1 一个简单的``C函数模板''例子

对于习惯使用Java等语言的人来说,``宏''的概念或许早已经成为学生时代的记忆还给老师了。当然,对于许多学习C语言的人来说,``宏''或许是一个让人难以理解而真的使用起来也只当成是定义常量的一个工具罢了。其实,C语言中的``宏''远比我们想象的有用。下面的代码就是用宏实现类似C++中模板概念的作用。代码如下所示。

这段代码利用宏定义了一个加法运算的函数模板,我们可以通过这两个宏来完成例如float类型的加法函数定义以及其调用。代码如下所示。

 

3.2 将``C函数模板''应用于求和

前面我们曾经定义了一个被称为SumGen的求和模式,并基于SumGen定义了一个计算多项式的函数SumGenPoly。但是可能有些人会觉得困惑,因为我的那个求和模式和多项式计算的函数都是基于对int数据类型的操作的,如果我们需要对float操作按照传统意义上的C,我们不得不重新写另一套求和模式。事实的确如此,但是我们也有变通的办法,比如利用我们这里说的``宏''。

根据我们的观察如果只是对C基本数据类型的操作,那么我们曾经定义的那个SumGen等函数的结构基本不用改变,而只是对其中的类型进行更名而已。所以,我们能利用上一节的概念将其重写。

如以上的代码所示,我们定义了若干个宏,根据我们的需要生成用于不同C基本类型的多项式计算的函数。我们只需要通过如下的代码将其生成即可。

上面的代码将定义一组函数,用于实现基于double数据类型的多项式计算函数,我们只需要在代码中用SUMGENONLY(double,...)就可以对其进行调用。这样做的优势在于,我们只要对某些宏做优化,就能对其一系列的函数实现优化操作。这是不是应该值得我们欢呼雀跃一下呢?

 

4 写在最后的话

或许对于许多C语言的``高手''而言,这篇文章并没有什么特别的,甚至是幼稚的。但是我想通过这篇文章让各位了解到C语言自身的美丽,简约又不失灵活。对于现在用惯``高级语言''的人来说,C语言本身的确缺乏许多``高级''特性。但是C却长久以来一直吸引众多像我们这种``普通人'',这一切的根源或许只有你深入了才能了解的。如果你确实对C语言又有兴趣了,那赶快打开你的编辑器展开一段C语言的浪漫之旅吧。

 

北斗星君

2009-10-04

 

由于格式支持等原因,本文内容并不完整。如有需要可留言索取PDF格式文本。如您需转载,请注明来自http://blog.csdn.net/visioncat。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 38
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值