输出这个简单的C程序

时间:2016-12-12 11:05:06

标签: c recursion

我是C ++的中级程序员。我遇到了这个代码,从1-1000打印数字没有循环,甚至没有递归。我真的不知道这是如何工作的。可以解释一下这段代码吗?

#include <stdio.h>
#include <stdlib.h>

void function(int j)
{
    static void (*const ft[2])(int) = { function, exit };

    printf("%d\n", j);
    ft[j/1000](j + 1);
}

int main(int argc, char *argv[])
{
 function(1);
}

3 个答案:

答案 0 :(得分:8)

简单的递归:

static void (*const ft[2])(int) = { function, exit };

首先创建一个函数指针数组,其中fpointers为functionexit,两者均为int

然后ft[j/1000](j + 1);只要[j/1000]小于1000就调用元素0上的j函数,因此调用function,否则{ {1}}被调用。

答案 1 :(得分:3)

这显然是递归的,它包含一个2元素的函数指针数组,并且调用它本身(ft[0]function)或exit()来退出程序。

这一行:

ft[j/1000](j + 1);
只要j/1000评估为0

就是递归调用。它可以改写为:

if(j < 1000)
  function(j + 1);
else
  exit(j + 1);

答案 2 :(得分:0)

在函数function内部,声明了一个指向函数本身的指针作为数组的元素

static void (*const ft[2])(int) = { function, exit };
                                    ^^^^^^^^

因此在函数内部调用

f( j + 1 );

ft[0]( j + 1 );

是等价的。

表达式

j / 1000
由于整数运算,

始终等于0,直到j等于1000

因此该函数递归地调用自身1000次。当j等于1000时,会调用函数exit,因为ft[1]是指向exit的指针。

程序编写得更简单明了。例如

#include <stdio.h>
#include <stdlib.h>

void function(int j)
{
    printf("%d\n", j);
    if ( j / 1000 == 0 ) f( j + 1 );
}

int main(int argc, char *argv[])
{
    function( 1 );
}

唯一的区别是在原始程序中有一个带参数1001的exit,而这个程序成功退出参数0。