[英]Output of this simple C program
我是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);
}
只是簡單的遞歸:
static void (*const ft[2])(int) = { function, exit };
首先創建一個函數指針數組,使用fpointers來function
和exit
,兩者都采用int
。
然后ft[j/1000](j + 1);
調用元素[j/1000]
處的函數,只要j
小於[j/1000]
就調為0
,因此function
,否則調用exit
。
這顯然是遞歸的,它包含一個2元素的函數指針數組,並調用自身( ft[0]
是function
)或exit()
退出程序。
這一行:
ft[j/1000](j + 1);
只要j/1000
計算結果為0
就是遞歸調用。 它可以改寫為:
if(j < 1000)
function(j + 1);
else
exit(j + 1);
在函數function
內部,聲明了一個指向函數本身的指針作為數組的元素
static void (*const ft[2])(int) = { function, exit };
^^^^^^^^
所以在函數里面這些調用
f( j + 1 );
和
ft[0]( j + 1 );
是等價的。
表達方式
j / 1000
由於整數運算直到j
等於1000
因此總是等於0。
因此,函數遞歸地調用自身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 );
}
唯一的區別是在原始程序中有一個名為exit的參數1001
而該程序成功退出參數0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.