2014-11-04 7 views
10

Widzę pytanie w kontekście programowania w języku C++, sprawdzam rozwiązanie i jeden z moich znajomych daje mi ten kod, działa idealnie, ale nie mogę zrozumieć jego logiki, a także, jak to działa Prace. Zapytałem go o to, ale on również nie wie, w jaki sposób program faktycznie działa, myślę, że on też bierze to rozwiązanie skądś. Ktoś może wyjaśnić logikę tego, co mam na myśli w linii (&main +(&exit - &main)*(j/1000))(j+1);?Drukuj od 1 do 1000 bez użycia pętli

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

void main(int j) { 
    printf("%d\n", j); 
    (&main + (&exit - &main)*(j/1000))(j+1); 
} 

Dzięki z góry

+2

Nie można rekursywnie wywoływać 'main' w C++. – BLUEPIXY

+1

Dzięki za szybką powtórkę. Próbuję go w C++, ale nie będzie działać, ale w c jego dzieła doskonale. ale nie wiem, jak działa. Oznacza jego logikę –

+7

Czy jest to standardowa sygnatura 'main? – axiom

Odpowiedz

28

Działa on następująco:

Wykonuje int podział j/1000, która będzie zwracać 0 zawsze podczas j jest mniejszy niż 1000. Więc operacja wskaźnik jest następujący:

&main + 0 = &main, for j < 1000. 

Następnie zwraca wynikowy funkcji wskazywanego przez wskaźnik przechodzących operacje jako parametr j+1. Podczas gdy j jest mniejszy niż 1000, wywoła on główną rekursywnie z parametrem o jeden więcej niż poprzedni krok.

Gdy wartość j osiąga 1000, to podział całkowitą j/1000 równa 1, a wyniki działania wskaźnik poniżej:

&main + &exit - &main = &exit. 

Następnie wywołuje funkcję exit, który kończy obróbkę.

+0

dzięki za powtórkę –

+0

czy funkcja wyjścia musi być napisana jawnie? lub można wywnioskować z głównego? –

+2

Funkcja wyjścia pochodzi z biblioteki standardowej C zdefiniowanej w pliku stdlib.h. – LoPiTaL

4

idę z wyjaśnieniem już wydane, ale byłoby łatwiej zrozumieć, jeśli napisane jak poniżej:

void main(int j) { 
    if(j == 1001) 
     return; 
    else 
    { 
     printf("%d\n", j); 
     main(j+1); 
    } 
} 

Powyższy kod działa tak samo jak kod już napisany.

+1

Naprawdę jest to prostsze niż powyższe. Ale logika jest inna –

+0

Pomysł jest taki sam. Ten, który masz, został właśnie zaciemniony, to jest kanoniczny sposób na rekursję: - chociaż zwykle nie używałbyś 'main', ponieważ technicznie nie jest poprawnym' głównym 'sygnaturą iirc – Baldrickk

+1

naprawdę to jest więcej prosta metoda, a nie powyżej. dzięki za powtórkę –

Powiązane problemy