Может кто-нибудь объяснить мне, почему это выход, рекурсивная функция C

#c #recursion #output

#c #рекурсия #вывод

Вопрос:

Я не понимаю, почему после запуска этого кода

 int n;
int f(int x) 
{ 
    int n; 
    if (x > 0) 
    {
        if (x % 2 == 0) 
        {
            cout << x % 10;
            n = 1   f(x / 10); 
        } 
        else 
        {
            n = 1   f(x / 10);
            cout << x % 10; 
        }
        return n; 
    } 
    else return 0;
}

int main()
{
    cout << ' ' << f(8174);
    return 0;
}
 

Я получаю 4817 4 вместо 48174

Мне нужно больше слов, но я не знаю, что сказать :))

Комментарии:

1. Я не могу воспроизвести ошибку. Я не получаю пробел в выводе.

2. Как вы получаете 4817 4 ? каковы ваши параметры компилятора / компилятора?

3. я попробовал на onlinegdb.com/online_c _compiler и вывод «4817 4». Я использую vs на своем ПК

4. У меня есть некоторые проблемы с сертификатом, поэтому я не могу попасть на этот сайт. Кажется, Иксисарвинен все же понял это. 🙂 Хороший улов!

5. Да, в онлайн-gdb с языком, установленным в C or C 14 , дает ответ на ваше описание. При C 17 этом нет пробела. Вы можете добавить эту информацию к своему вопросу, если хотите.

Ответ №1:

Перед C 17 порядок вычисления аргументов не указан. Это означает, что компилятор может либо запускать f(8174) (и, следовательно, все его std::cout << ... операторы) до std::cout << ' ' или после этого.

Исправление довольно простое, вам нужно разделить ваш cout на два оператора:

 int main()
{
    std::cout << ' ';
    std::cout << f(8174)
    return 0;
}
 

Комментарии:

1. Порядок вычисления аргументов в C 17 по-прежнему не определен. Однако изменился порядок вычисления в выражении оператора сдвига.