Что возвращает рекурсивная функция, если у нее нет оператора return? - PullRequest
0 голосов
/ 11 июня 2018

Что возвращает рекурсивная функция, если у нее нет оператора возврата в отдельном предложении.

#include <stdio.h>

int rec(int i)
{
    if (i != 3) 
        return rec(++i);
}

int main()
{
    rec(5);
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

Поскольку у других есть указатель, это неопределенное поведение.Вдвойне для целочисленного переполнения.Вот что делает gcc из функции на x86_64 (когда вы игнорируете предупреждение):

0000000000000000 <rec>:
   0:   f3 c3                   repz retq 

Он просто возвращает с любым значением в регистре возврата.

Отлично для другихдействительным результатом будет формирование вашего жесткого диска или продажа вашей души дьяволу.Я надеюсь, что clang превратит это в код операции # ub2, но не сможет проверить этот atm.

0 голосов
/ 11 июня 2018

См. C11 стандарт , §6.9.1 Определения функций :

12 Если } достигается завершение функции, и вызывающая сторона использует значение вызова функции, поведение не определено.

Таким образом, если вы получили функцию, которая должна возвращать значение, это может не возвращать значение.Но если функция не возвращает значение, а вызывающий код пытается использовать возвращаемое значение функции впоследствии, поведение не определено.Не имеет значения, используется ли функция рекурсивно или нет.

0 голосов
/ 11 июня 2018

Если не пустая функция без оценки оператора возврата, поведение будет undefined .

Согласно Cppreference :

Достижение конца функции, отличной от main, эквивалентно return ;.Для основного см. Главную функцию. Достижение конца любой другой функции, возвращающей значение, является неопределенным поведением, но только если результат функции используется в выражении.

C Standard, 5.1.2.2.3, пункт 1 [ИСО / МЭК 9899: 2011]:

«Достижение}, которое завершает основную функцию, возвращает значение 0».В результате для элемента управления допустимо достигать конца функции main () без выполнения оператора возврата.

0 голосов
/ 11 июня 2018

Из C документации по возврату :

Достижение конца любой другой функции, возвращающей значение, является неопределенным поведением, но только если результат функции используется вexpression.

Таким образом, поведение не определено, если какая-либо функция должна возвращать значение, но не возвращает значение, и когда мы пытаемся использовать это возвращаемое значение.В большинстве реализаций он возвращает мусор.

В вашем случае вы не используете возвращаемое значение, поэтому здесь это не имеет никакого эффекта.Также вы получите бесконечную рекурсию, так как первый вызов имеет 5, и он увеличивается в последующих вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...