鱼C论坛

 找回密码
 立即注册
查看: 1610|回复: 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 就会指向不同的函数,然后,分别打印函数的执行结 ...
想知道小甲鱼最近在做啥?请访问 -> 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 是始终没有改变的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 19:13:29 | 显示全部楼层
返回函数的函数? 你说的是递归吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


不是。例如下面的代码
#include <stdio.h>//加入 标准输入输出库 
typedef void *        e;
typedef int f (e data);
f a(int b){
                printf("b==%d",b);
                return b;
        };
int main(){ 
        a(3);
        return 0;
}
编译会报错
错误:
‘a’声明为返回一个函数的函数。
‘a’ declared as function returning a function
我想知道怎么使用这种函数。请举个例子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int add(const int a , const int b)
{
        return a + b ;
}

int sub(const int a , const int b)
{
        return a - b ;
}

int mul(const int a , const int b)
{
        return a * b ;
}

int div(const int a , const int b)
{
        return a / b ;
}

int (* getfun(void))(const int , const int)
{
        static int d = 0                 ;
        int (* p)(const int , const int) ;
        int k                            ;
        k = d % 4                        ;
        switch(k) {
                case 0: p = add          ;
                        break            ;
                case 1: p = sub          ;
                        break            ;
                case 2: p = mul          ;
                        break            ;
                case 3: p = div          ;
                        break            ;
        }
        d ++                             ;
        return p                         ;
}


main(void)
{
        int a , b , c                    ;
        int (* p)(const int , const int) ;
        a = 20                           ;
        b = 5                            ;
        p = getfun()                     ;
        printf("%d\n" , p(a , b))        ;
        p = getfun()                     ;
        printf("%d\n" , p(a , b))        ;
        p = getfun()                     ;
        printf("%d\n" , p(a , b))        ;
        p = getfun()                     ;
        printf("%d\n" , p(a , b))        ;
}
想知道小甲鱼最近在做啥?请访问 -> 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算出的时间也很少。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我没看明白这个代码跟我的问题有什么关系,能详细讲讲吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 15:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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