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

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

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

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

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

cigien 18.12.2020 09:13

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

Ghasem Ramezani 18.12.2020 09:17

я попробовал на onlinegdb.com/online_c++_compiler и выдал "4817 4". Я использую vs на своем компьютере

Gabriel 18.12.2020 09:18

здесь тот же код onlinegdb.com/BJVjUk93P но 4817 4 вывода

Gabriel 18.12.2020 09:23

У меня проблема с сертификатом, поэтому я не могу зайти на этот сайт. Хотя, похоже, Юксисарвинен это понял. :-) Хороший улов!

Ted Lyngmo 18.12.2020 09:27

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

cigien 18.12.2020 09:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Порядок вычисления аргументов в C++17 по-прежнему не определен. Что изменилось, так это порядок вычисления в выражении оператора сдвига.

Rane 18.12.2020 11:53

Другие вопросы по теме