Я не понимаю, почему после запуска этого кода
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
Мне нужно больше слов, но я не знаю, что сказать:))
Как вы получаете 4817 4
? каковы ваши параметры компилятора/компилятора?
я попробовал на onlinegdb.com/online_c++_compiler и выдал "4817 4". Я использую vs на своем компьютере
здесь тот же код onlinegdb.com/BJVjUk93P но 4817 4 вывода
У меня проблема с сертификатом, поэтому я не могу зайти на этот сайт. Хотя, похоже, Юксисарвинен это понял. :-) Хороший улов!
Да, в онлайн-gdb с языком, установленным на C++
или C++14
, вы получите ответ, который вы описываете. С C++17
места нет. Вы можете добавить эту информацию к своему вопросу, если хотите.
До C++17 порядок оценки аргументов не указан. Это означает, что компилятор может запускать f(8174)
(и, следовательно, все его операторы std::cout << ...
) до std::cout << ' '
или после этого.
Исправление довольно простое, вам нужно разделить cout на два оператора:
int main()
{
std::cout << ' ';
std::cout << f(8174)
return 0;
}
Порядок вычисления аргументов в C++17 по-прежнему не определен. Что изменилось, так это порядок вычисления в выражении оператора сдвига.
Я не могу воспроизвести ошибку. Я не получаю пробел в выводе.