欢迎来到天天文库
浏览记录
ID:50824796
大小:42.95 KB
页数:5页
时间:2020-03-15
《C语言编程实战-1-回调函数.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、回调函数在C语言编程中,我们经常听到回调函数(callbackfunction)一说。对于C语言新手而言,回调函数可能是一个比较难于理解的东西。今天我将通过一个实际例子,来讲解什么是回调函数,为什么要用回调函数。程序任务:写一段程序,实现对一个整型数据的排序功能,可以递增排序,也可以递减排序。上述任务的编程并不难,对于排序而言,我们至少会使用冒泡法。于是,我相信很多同学会写出这样的代码:#include//升序排序intsort_asc(intnums[],intcnt){inti;intj;for(i=
2、0;inums[m]){m
3、=j;}}//交换if(m!=i){intt=nums[m];nums[m]=nums[i];nums[i]=t;}}return0;}voidprint_array(intnum[],intcnt){inti;for(i=0;i4、0);sort_dec(num,10);print_array(num,10);return0;}在上面的例子中,我们实现了两个排序函数:sort_asc()与sort_dec(),分别用于升序与降序。不难发现,这两个函数非常相像,差别只在于一个判断符。这意味着我们写了冗余代码。十几年的编程生涯已经无数次非常清晰地告诉过我:冗余代码就负担,是垃圾。也许已经有人想到了消除冗余代码的方法:把两个函数合并成一个,函数后边加一个参数用于标识是升序还是降序,然后程序里有差异的地方用这个标识来走分支。老实说,这是一个非常不错的方法,但5、并不优雅,因为加上的分支条件会使们的程序变复杂。那更好的方法是什么呢?答案是有很多,但是今天讲的是回调函数,那回调函数就要登场了。我们来看改进后的代码:#includeintsort(intnums[],intcnt,int(*cmp)(int,int)){inti;intj;for(i=0;i6、nums[m]=nums[i];nums[i]=t;}}return0;}voidprint_array(intnum[],intcnt){inti;for(i=0;i7、,8,19,0};sort(num,10,num_cmp_asc);print_array(num,10);sort(num,10,num_cmp_dec);print_array(num,10);return0;}耐心的同志或者已经看来,改进后的代码只有一个sort函数了,但后边多了一个函数指针参数cmp,这正是所谓的回调函数。还sort函数的处理过程中,不再直接比较两个数值的大小,而是调用cmp来获取结果。在sort函数的外边,我们新增了两个整数比较函数:num_cmp_asc()与num_cmp_dec(),在主函数8、调用排序函数sort的时候,它们当作回调函数传给了sort()。这样sort就无需了解整数大小比较这个细节,回调函数告诉它结果是大就是大,是小就是小,它只需安安心心按照cmp告诉的比较结果来做自认为的升序排序,虽然num_cmp_dec()回调欺骗了它。正是因为这样小小的欺骗,我们非常巧妙地实现了用单一
4、0);sort_dec(num,10);print_array(num,10);return0;}在上面的例子中,我们实现了两个排序函数:sort_asc()与sort_dec(),分别用于升序与降序。不难发现,这两个函数非常相像,差别只在于一个判断符。这意味着我们写了冗余代码。十几年的编程生涯已经无数次非常清晰地告诉过我:冗余代码就负担,是垃圾。也许已经有人想到了消除冗余代码的方法:把两个函数合并成一个,函数后边加一个参数用于标识是升序还是降序,然后程序里有差异的地方用这个标识来走分支。老实说,这是一个非常不错的方法,但
5、并不优雅,因为加上的分支条件会使们的程序变复杂。那更好的方法是什么呢?答案是有很多,但是今天讲的是回调函数,那回调函数就要登场了。我们来看改进后的代码:#includeintsort(intnums[],intcnt,int(*cmp)(int,int)){inti;intj;for(i=0;i6、nums[m]=nums[i];nums[i]=t;}}return0;}voidprint_array(intnum[],intcnt){inti;for(i=0;i7、,8,19,0};sort(num,10,num_cmp_asc);print_array(num,10);sort(num,10,num_cmp_dec);print_array(num,10);return0;}耐心的同志或者已经看来,改进后的代码只有一个sort函数了,但后边多了一个函数指针参数cmp,这正是所谓的回调函数。还sort函数的处理过程中,不再直接比较两个数值的大小,而是调用cmp来获取结果。在sort函数的外边,我们新增了两个整数比较函数:num_cmp_asc()与num_cmp_dec(),在主函数8、调用排序函数sort的时候,它们当作回调函数传给了sort()。这样sort就无需了解整数大小比较这个细节,回调函数告诉它结果是大就是大,是小就是小,它只需安安心心按照cmp告诉的比较结果来做自认为的升序排序,虽然num_cmp_dec()回调欺骗了它。正是因为这样小小的欺骗,我们非常巧妙地实现了用单一
6、nums[m]=nums[i];nums[i]=t;}}return0;}voidprint_array(intnum[],intcnt){inti;for(i=0;i7、,8,19,0};sort(num,10,num_cmp_asc);print_array(num,10);sort(num,10,num_cmp_dec);print_array(num,10);return0;}耐心的同志或者已经看来,改进后的代码只有一个sort函数了,但后边多了一个函数指针参数cmp,这正是所谓的回调函数。还sort函数的处理过程中,不再直接比较两个数值的大小,而是调用cmp来获取结果。在sort函数的外边,我们新增了两个整数比较函数:num_cmp_asc()与num_cmp_dec(),在主函数8、调用排序函数sort的时候,它们当作回调函数传给了sort()。这样sort就无需了解整数大小比较这个细节,回调函数告诉它结果是大就是大,是小就是小,它只需安安心心按照cmp告诉的比较结果来做自认为的升序排序,虽然num_cmp_dec()回调欺骗了它。正是因为这样小小的欺骗,我们非常巧妙地实现了用单一
7、,8,19,0};sort(num,10,num_cmp_asc);print_array(num,10);sort(num,10,num_cmp_dec);print_array(num,10);return0;}耐心的同志或者已经看来,改进后的代码只有一个sort函数了,但后边多了一个函数指针参数cmp,这正是所谓的回调函数。还sort函数的处理过程中,不再直接比较两个数值的大小,而是调用cmp来获取结果。在sort函数的外边,我们新增了两个整数比较函数:num_cmp_asc()与num_cmp_dec(),在主函数
8、调用排序函数sort的时候,它们当作回调函数传给了sort()。这样sort就无需了解整数大小比较这个细节,回调函数告诉它结果是大就是大,是小就是小,它只需安安心心按照cmp告诉的比较结果来做自认为的升序排序,虽然num_cmp_dec()回调欺骗了它。正是因为这样小小的欺骗,我们非常巧妙地实现了用单一
此文档下载收益归作者所有