2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Почему программа... работает?!
Сообщение05.07.2013, 02:50 
Аватара пользователя
Обнаружил странное поведение программы. Знатоки, внимание на экран.
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
int power(int a, int x)
{
    int res;
    if(x>0)
    {
        res=a*power(a,x-1);
    }
    else
    {
        res=0;
    }    
}
main()
{
    printf("%d\n",power(2,10));
}

Программа выдает 2048. Вообще, если задать другие $a$ и $x$, то она всегда выдаст $a^{x+1}$
Вопросы:
а) почему именно 2048?
б) почему она вообще что-то выдает, ведь return-а в функции power нет?!
Примечания:
а) если поменять неправильную строчку res=0 на res=1, то абсолютно ничего не меняется. Так что в это тыкать не надо:)
б) если добавить недостающую строчку return res, то программа ведёт себя так, как и задумывалось - просто считает степень. Однако не забудь я этот return - не было бы этой интересной (для меня) загадки.

-- Пт июл 05, 2013 04:02:54 --

P.S. Язык совсем не знаю, да.

 
 
 
 Re: Почему программа... работает?!
Сообщение05.07.2013, 03:44 
Аватара пользователя
Во-первых, настройте свой компилятор так, чтобы он выдавал предупреждения. Это очень помогает.

Почему эта программа работает.
Дело в том, что стандарт C очень многие вещи объявляет не ошибкой, а неопределенным поведением.
То есть, в частности, функция без return формально не является неправильной, но конкре тный компилятор вправе при обработке этой функции делать что угодно.
Это значит, что программа, содержащая эту функцию,
1) не обязана компилироваться
2) не обязана корректно работать
3) не обязана выдавать один и тот же результат при разных опциях компилятора
4) не обязана выдавать один и тот же результат при каждом запуске
Например, у меня Ваша программа выдает не 2048, а случайный результат.
В используемых calling conventions целочисленный результат функции должен перед возвратом находиться в регистре EAX (или RAX для 64-битных систем). То есть если явного return в функции нет и компилятор просто вставил его в конце функции, то результатом будет то, что в итоге получилось в этом регистре.

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

 
 
 
 Re: Почему программа... работает?!
Сообщение05.07.2013, 14:15 
Аватара пользователя
Xaositect
Ясно, примерно такие же мысли были (кроме регистра). И всё-таки довольно забавно.
Компилятор обязательно настрою, как только буду писать что-то серьёзное:)

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group