#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
orC 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 по-прежнему не определен. Однако изменился порядок вычисления в выражении оператора сдвига.