2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Почему программа... работает?!
Сообщение05.07.2013, 02:50 
Заслуженный участник
Аватара пользователя


28/07/09
1238
Обнаружил странное поведение программы. Знатоки, внимание на экран.
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Во-первых, настройте свой компилятор так, чтобы он выдавал предупреждения. Это очень помогает.

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

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

 Профиль  
                  
 
 Re: Почему программа... работает?!
Сообщение05.07.2013, 14:15 
Заслуженный участник
Аватара пользователя


28/07/09
1238
Xaositect
Ясно, примерно такие же мысли были (кроме регистра). И всё-таки довольно забавно.
Компилятор обязательно настрою, как только буду писать что-то серьёзное:)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group