2015-09-13 5 views
-2

Я следующий код, который должен вычислить факториал заданного числа:неподписанных долгое INT сделать переменную равной 0

#include <stdio.h> 

int main() 
{ 
    unsigned short int n, i; 
    unsigned long int fact=1; 

    printf("Give n:"); 
    scanf("%u", &n); 
    printf("\nfact=%u", fact); 

    for(i = 1; i <= n; i++) 
     fact = fact * i; 

    printf("\n%u!=%u", n, fact); 
    return 0; 
} 

Я попытался проверить, что является проблемой, и обнаружил, что переменная в том, 0 . Может кто-нибудь объяснить мне, почему переменный факт равен 0, так как я инициализировал его 1? Если это имеет значение, я использую компилятор GNU GCC в Codeblocks.

+0

Почему вы используете 'неподписанные short' так или иначе? И вам, вероятно, будет лучше использовать 'unsigned long long fact'. –

+0

'% lu' для длинных неподписанных и'% hu' для коротких неподписанных – billpcs

+0

Я изменил '% u' в'% hu' и, как ни удивительно, для меня программа работает. Теперь переменной 'fact' является' 1'. Теперь я более смущен. Это изменение, которое я сделал для переменной 'n', но также влияет на переменную' fact'. Как это возможно? –

ответ

3

Поскольку вы используете GCC, вы должны использовать -Wall как вариант, который говорит вам, что именно эта проблема:

prog.c: In function ‘main’: 
prog.c:9:4: warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat=] 
    scanf("%u", &n); 
    ^

Вы говорите это, чтобы прочитать значение в unsigned int переменной, но вы указываете указатель на unsigned short, который меньше, поэтому он перезаписывает все, что после n в стеке стека, вызывая неопределенное поведение - в вашем случае, развращая fact.

Мораль: Всегда используйте -Wall для того, чтобы предупреждения и обращать на них внимание ...

+0

Я не знал о опции '-Wall'; теперь я активировал его. Спасибо за этот совет и за разъяснения об ошибке; среди многих других, мне не хватает понимания того, что происходит внутри компьютерной памяти. –

Смежные вопросы