簡體   English   中英

輸出這個簡單的C程序

[英]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來functionexit ,兩者都采用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM