我是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);
}
答案 0 :(得分:8)
简单的递归:
static void (*const ft[2])(int) = { function, exit };
首先创建一个函数指针数组,其中fpointers为function
和exit
,两者均为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。