C - Pytanie o podstawy

0

Witam, mam pytanie czemu program mi się nie chce poprawnie skompilować, mianowicie program ma liczyć silnie rekurencyjnie i działa dobrze w takiej postaci:

int main()
{
    unsigned int n;
    printf("Podaj n:\n");
    scanf("%u", &n);
    printf("%u", silnia(n));
    return 0;
}

   int silnia(unsigned int a){
   return (a) ? a * silnia(a-1) : 1;
}
 

Ale jako że silnia przyjmuje duże wartości to chciałem użyć unsigned long long int, czyli

int main()
{
    unsigned int n;
    printf("Podaj n:\n");
    scanf("%u", &n);
    printf("%llu", silnia(n));
    return 0;
}

unsigned long long int silnia(int a){
   return (a) ? a * silnia(a-1) : 1;
}
 

ale się już nie chce skompilować w tym momencie (codeblock). Jak podejrzewam może to mieć związek z tym, że to jest f. rekurencyjna i zwraca również samą siebie. Jak to poprawić?

ps. chciałbym również się spytać o taką rzecz - czy słowo operand odnosi się do np %d?
ps2. chciałbym się upewnić, czy jak dla floata jest %f, to dla double jest %lf? bo tak gdzieś wyczytałem i nie jestem pewien

2

Ponieważ silnia() ma być w całości przed main() albo przed main() trzeba dodać prototyp funkcji silnia();

0

wow rzeczywiście, działa aż miło. Dzięki. A można jeszcze prosić na odpowiedź na to co się znajduje w postscriptum?

1

%f jest dla double. Do funkcji o zmiennej liczbie argumentów nie da się przesłać typu float - jest on konwertowany (promowany) na double. Lf to long double.

W C czy C++ operand to jest to jest element wyrażenia z operatorami. W c = a + b wszystkie trzy literki (zmienne) są moim zdaniem operandami, chociaż może ktoś ma inną interpretację. %d to za to z pewnością nie jest operand - to element formatu.

0

dziękuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1