鱼C论坛

 找回密码
 立即注册
查看: 2099|回复: 6

[已解决]请问返回函数的函数该怎么用

[复制链接]
发表于 2019-10-10 17:03:32 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 dt3tc 于 2019-10-10 18:58 编辑

哪位朋友知道有劳举个栗子
谢谢
最佳答案
2019-10-10 17:03:33
本帖最后由 jackz007 于 2019-10-11 10:14 编辑

      add()、sub()、mul()、div() 是四个参数和调用形式完全相同的功能完全不同的函数,getfun() 就是那个返回函数指针的函数,这个函数内置了一个静态局部变量,每次调用都会根据这个变量的值,决定返回上述四个函数中一个函数的调用地址,同时,让这个静态变量加一,以便下次调用的时候,会返回另外一个函数的调用地址。
      于是,在 main() 中,执行一次 p = getfun() ,p 就会指向不同的函数,然后,分别打印函数的执行结果,在整个main() 中,作为函数调用参数的变量 a 和 b 是始终没有改变的。

最佳答案

查看完整内容

add()、sub()、mul()、div() 是四个参数和调用形式完全相同的功能完全不同的函数,getfun() 就是那个返回函数指针的函数,这个函数内置了一个静态局部变量,每次调用都会根据这个变量的值,决定返回上述四个函数中一个函数的调用地址,同时,让这个静态变量加一,以便下次调用的时候,会返回另外一个函数的调用地址。 于是,在 main() 中,执行一次 p = getfun() ,p 就会指向不同的函数,然后,分别打印函数的执行结 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 17:03:33 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-10-11 10:14 编辑

      add()、sub()、mul()、div() 是四个参数和调用形式完全相同的功能完全不同的函数,getfun() 就是那个返回函数指针的函数,这个函数内置了一个静态局部变量,每次调用都会根据这个变量的值,决定返回上述四个函数中一个函数的调用地址,同时,让这个静态变量加一,以便下次调用的时候,会返回另外一个函数的调用地址。
      于是,在 main() 中,执行一次 p = getfun() ,p 就会指向不同的函数,然后,分别打印函数的执行结果,在整个main() 中,作为函数调用参数的变量 a 和 b 是始终没有改变的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 19:13:29 | 显示全部楼层
返回函数的函数? 你说的是递归吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-10 19:24:50 | 显示全部楼层
本帖最后由 dt3tc 于 2019-10-10 19:35 编辑
西瓜小刚 发表于 2019-10-10 19:13
返回函数的函数? 你说的是递归吗?


不是。例如下面的代码
  1. #include <stdio.h>//加入 标准输入输出库
  2. typedef void *        e;
  3. typedef int f (e data);
  4. f a(int b){
  5.                 printf("b==%d",b);
  6.                 return b;
  7.         };
  8. int main(){
  9.         a(3);
  10.         return 0;
  11. }
复制代码

编译会报错
错误:
‘a’声明为返回一个函数的函数。
‘a’ declared as function returning a function
我想知道怎么使用这种函数。请举个例子。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 20:23:55 | 显示全部楼层
本帖最后由 jackz007 于 2019-10-10 20:25 编辑
  1. #include <stdio.h>

  2. int add(const int a , const int b)
  3. {
  4.         return a + b ;
  5. }

  6. int sub(const int a , const int b)
  7. {
  8.         return a - b ;
  9. }

  10. int mul(const int a , const int b)
  11. {
  12.         return a * b ;
  13. }

  14. int div(const int a , const int b)
  15. {
  16.         return a / b ;
  17. }

  18. int (* getfun(void))(const int , const int)
  19. {
  20.         static int d = 0                 ;
  21.         int (* p)(const int , const int) ;
  22.         int k                            ;
  23.         k = d % 4                        ;
  24.         switch(k) {
  25.                 case 0: p = add          ;
  26.                         break            ;
  27.                 case 1: p = sub          ;
  28.                         break            ;
  29.                 case 2: p = mul          ;
  30.                         break            ;
  31.                 case 3: p = div          ;
  32.                         break            ;
  33.         }
  34.         d ++                             ;
  35.         return p                         ;
  36. }


  37. main(void)
  38. {
  39.         int a , b , c                    ;
  40.         int (* p)(const int , const int) ;
  41.         a = 20                           ;
  42.         b = 5                            ;
  43.         p = getfun()                     ;
  44.         printf("%d\n" , p(a , b))        ;
  45.         p = getfun()                     ;
  46.         printf("%d\n" , p(a , b))        ;
  47.         p = getfun()                     ;
  48.         printf("%d\n" , p(a , b))        ;
  49.         p = getfun()                     ;
  50.         printf("%d\n" , p(a , b))        ;
  51. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 21:29:36 | 显示全部楼层
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。
它的具体功能是返回处理器调用某个进程或函数所花费的时间。函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,其中clock_t是用来保存时间的数据类型。
在time.h文件中,我们可以找到对它的定义:
#ifndef _CLOCK_T_DEFINED  
typedef long clock_t;  
#define _CLOCK_T_DEFINED  
#endif  
clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK CLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000,这表示硬件滴答1000下是1秒,因此要计算一个进程的时间,用clock()除以1000即可。
clock的返回值一直是0的原因:
1、编译器优化,for循环实际根本没执行,直接跳过去了,所以时间为0。
2、clock计算的是程序占用cpu的时间,如果你的程序执行的动作很少,那么clock算出的时间也很少。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-11 08:00:05 | 显示全部楼层

我没看明白这个代码跟我的问题有什么关系,能详细讲讲吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 05:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表