2016-12-12 14 views
7

Jestem pośrednim programistą C++. Natknąłem się na ten kod, który drukuje liczbę od 1-1000 bez pętli, nawet rekursji. I nie mam pojęcia, jak to działa. Czy ktoś może wyjaśnić ten kod?Wyjście tego prostego programu C

#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); 
} 
+1

To jest rekurencja, w pewnym sensie. –

+2

To jest 'c', a nie' C++ '. –

+1

@NATS W końcu wiem, co oznacza termin "programista pośredniczący w C++". Dzięki. –

Odpowiedz

8

Wystarczy rekursji prostej:

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

Pierwsza tablica wskaźnik funkcja jest tworzony z fpointers do function i exit, zarówno biorąc int.

Następnie ft[j/1000](j + 1); wywołuje funkcję w elemencie [j/1000] która 0 dopóki j jest mniejsza niż 1000, więc function nazywa, inaczej exit nazywa.

+0

skąd pochodzi ft. nigdzie nie jest zdefiniowany – NATS

+1

@NATS Tak, to tablica zawierająca wskaźniki funkcji nazywa się 'ft', składnia deklaracji wskaźnika funkcji jest tylko trochę trudna do odczytania. P.S użyć backticks, aby mieć kod w komentarzach '. –

3

To oczywiście rekurencyjne, że zawiera układ 2-elementowej wskaźników funkcji i wymaga albo sam (ft[0] jest function) lub exit() wyjście z programu.

Linia:

ft[j/1000](j + 1); 

jest wywołanie rekurencyjne dopóki j/1000 ocenia się 0. To może być zapisane jako:

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

w porządku. mam to – NATS

+0

czy możesz mi powiedzieć, dlaczego moje pytanie ma "-1"? – NATS

+0

@NATS Nie, nie wiem. Nie głosowałem w dół. Może to być spowodowane zamieszaniem C vs C++. – unwind

0

Wewnątrz funkcji function nie jest zadeklarowany wskaźnik do samej funkcji jako element tablicy

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

So wewnątrz funkcji tych połączeń

f(j + 1); 

i

ft[0](j + 1); 

są równoważne.

Wyrażenie

j/1000 

zawsze wynosi 0 powodu arytmetyki całkowitej aż j wynosi 1000.

W ten sposób funkcja rekursywnie wywołuje się 1000 razy. Gdy j jest równe 1000, wywoływane jest wywołanie funkcji, ponieważ ft[1] jest wskaźnikiem do exit.

Program można napisać znacznie prostsze i wyraźniejsze. Na przykład

#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); 
} 

Jedyną różnicą jest to, że w pierwotnym programie tam nazywa wyjście z argumentów 1001 natomiast ten program z powodzeniem wyjście z argumentów 0.

+0

dobre wyjaśnienie – NATS

Powiązane problemy