Amine Marzouki - 13 days ago 5
C Question

# Why the place of the assignment of a variable is so important? [C]

While trying to solve an exercise of Kochan - Programming in C Book (ex 4 loops chapter) the question was to write the first 10 factorial numbers. I tried to solve it with nested loops, but the results were a complete rubbish.
I looked up, and I found one solution that was very similar to mine but I noticed that the place of the variable is different.

Previous solution:

``````/*This program calculates the first 10 factorials*/

#include <stdio.h>

int main(void){
int n,i;
unsigned long int fact=1;
printf(" n\t\t  n!\n");
printf("---\t\t--------\n");
for(n=1; n<=10; n++){
for(i = 1; i<=n; i++){
fact*=i;
}
printf("%2d\t\t%7ld\n",n,fact);
}

return 0;
}
``````

Output:

``````./factorial
n        n!
---     --------
1            1
2            2
3           12
4          288
5        34560
6      24883200
7      857276416
8      -511705088
9      1073741824
10            0
``````

Fixed solution:

``````/*This program calculates the first 10 factorials*/

#include <stdio.h>

int main(void){
int n,i;
printf(" n\t\t  n!\n");
printf("---\t\t--------\n");
for(n=1; n<=10; n++){
unsigned long int fact=1;
for(i = 1; i<=n; i++){
fact*=i;
}
printf("%2d\t\t%7ld\n",n,fact);
}

return 0;
}
``````

Output:

``````./factorial
n        n!
---     --------
1            1
2            2
3            6
4           24
5          120
6          720
7         5040
8        40320
9       362880
10      3628800
``````

Notice that the only difference is that that variable fact is local in the second solution while it was global in the previous one.

So I guess the question is clarified now, why changing just the place seems to solve the issue? Why there is this issue of placing variables in the first place?
The issue is not so much where the variable is declared, as where it is initialized. In the correct code, `fact` is set to `1` for each new `n`, in order to "start fresh" and calculate the factorial. In your code, you don't reset `fact`, so it continues to hold the leftover value from the previous `n`, so you're computing n! times the previous result.