LINUX.ORG.RU

Рекурсивные функции


0

1

Увидел задачку, немного в ступор впал:

#include «stdio.h»
int fact_rec2(int n)
{
int a;
if(n<1) return 0;
if(n==1) return 1;
a=n*fact_rec2(n-1);
return a;//почему эту строчку можно не писать?
}

int main(int argc, char* argv[])
{
int x;//=0;
scanf(«%d»,&x);
printf(«%d\n»,fact_rec2(x));
return 0;
}

Ето какая-та фича рекурсивных функций или оптимизации. Или я просто туплю?



Последнее исправление: abr_linux (всего исправлений: 1)
Ответ на: комментарий от ms-dos32

ms-dos32

У меня gcc выдает (и должен выдавать!) ошибку о том, что функция, возвращающая int, не возвращает ничего

это не ошибка, а предупреждение. Была-бы ошибка, вообще-бы не собралось.

ms-dos32

Значит, любой пример успешной работы программы - всего лишь случайность

да, то что это быдлокод, никто и не сомневается.

drBatty ★★
()
Ответ на: комментарий от drBatty

Странно, вылез из Geany и скомпилировал из консоли gcc. Он вообще никаких сообщений не выплюнул, однако факториал считается успешно, 60 раз прогнал и ни разу ошибок не было. Чудеса.

ms-dos32
()
Ответ на: комментарий от ms-dos32

ms-dos32

Он вообще никаких сообщений не выплюнул

дык -Wall, у меня оно по дефолту, за былокод сам себя анально караешь...

ms-dos32

60 раз прогнал

лучше-бы вы ассемблер подучили, чтоб не мучится так...

drBatty ★★
()
Ответ на: комментарий от drBatty

Офигеть, все ошибки и предупреждения исчезли, будто их и не было

ms-dos32
()
Ответ на: комментарий от ms-dos32

ms-dos32

objdump?

угу. или gcc -S, но тогда программы не будет.

ms-dos32

Добавил -Wall в параметры, все равно нет предупреждения

что-то вы делаете не так...

drBatty ★★
()
Ответ на: комментарий от drBatty

О, совсем забыл, теперь:

test.c: In function ‘fact_rec2’:
test.c:9: warning: control reaches end of non-void function

ms-dos32
()
Ответ на: комментарий от ms-dos32

Ага, вот она, бага!

Это же фича - результат в int не помещается.

quasimoto ★★★★
()
Ответ на: комментарий от drBatty

нет? мне в принципе ||, как и моим программам.

Не понял...

Я просто подтвердил, что у меня 64 бита, и что я просто об этом не подумал, хотя всё, вроде, было очевидно...

anonymous
()
Ответ на: комментарий от anonymous

anonymous

нет? мне в принципе ||, как и моим программам.

Не понял...

программы на С/С++ надо писать таким образом, что-бы они правильно работали при любой ширине int. Потому-что в стандарте не сказано, сколько бит в int'е. Если не получается, то можно юзать специальные типы, как в этой программе Рекурсивные функции (комментарий)

Беда в том, что возвращаемое значение по умолчанию таки int, хотя у нас оно uint64_t. В стандарте этот случай быдлокода естественно не описан, но ИМХО должно быть именно так...

anonymous

Я просто подтвердил, что у меня 64 бита, и что я просто об этом не подумал, хотя всё, вроде, было очевидно...

всё было-бы очевидно, если-бы вы написали return uint64_t;

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.