mam ten kod C, które mam problemy zrozumienie.jakiś „dziwny” C kod
int foo(int f(int,int), int g(int,int), int x) {
int y = g(x,x);
return f(y,y);
}
int sq(int x, int y) {
if (x == 1) { return y; }
return pl(y, sq(x-1, y));
}
int pl(int x, int y) {
if (x == 0) { return y; }
return pl(x-1, y+1);
}
int main (int argc, const char * argv[])
{
printf("sq = %d\n", sq);
printf("output=%d\n", foo(sq, pl, 1));
return 0;
}
Zrozumiałem, że f jest pomnożenie dwóch zmiennych i g jest pomnożenie, oni najwyraźniej zbudowany w funkcja foo ma dwa parametry zadeklarowane jako deklaracja funkcji -> f (int, int) i g (int, int). Ale wtedy foo jest przekazywany z dwoma argumentami - sq i pl. Te dwa argumenty mają również bardzo dziwne wartości - 3392 i 3488, są to logiczne adresy funkcji sq i pl? Jeśli są i są przekazywane jako liczby całkowite, to w jaki sposób foo je akceptuje? Od foo, ma deklarację funkcji w miejsce parametrów, do których te argumenty powinny się kierować.
Dziękuję, EDYCJA: fajnie, dziękuję wam wszystkim, to wyjaśniło sprawę!
Czy to kompilacja? Nie sądziłem, że łatwo jest stworzyć funktora bez wskaźników. Głupek, to musi być albo jak widziałbyś "bardzo dziwne wartości" –
wydrukuj adres z '% p': printf (" sq =% p \ n ", sq); – perreal
foo przyjmuje 3 argumenty - dwie funkcje (int, int) identyfikatory/wskaźniki i jedną liczbę całkowitą. Wywołanie foo przekazuje dwie funkcje i jedną liczbę całkowitą. Jest to nieco dziwaczne, ale nic szczególnie egzotycznego. –