Как было указано в комментариях, g cc распознает оба идентичных . Для того, что clang делает с кодом, есть дополнительный вопрос . Помимо лязга, идущего в havo c, есть разница в costeti c.
Однако в вашем коде есть небольшая проблема. factorial(0)
заставит n-1
обернуться и продолжить до тех пор, пока не достигнет n==1
, только чтобы вернуть неправильное значение: 0
из 0 * faculty(-1U)
в вызове n==0
верхнего уровня. (0!
определено как 1
).
Два 1
в вашем коде - это магические числа c, и на самом деле это два разных числа, просто они имеют одно и то же значение , Одним из них является условие для остановки рекурсии, другим является значение, которое вы возвращаете, когда рекурсия останавливается. Вы выбрали неправильное условие остановки. Некоторые могут настаивать на том, что называть эти константы глупо, но я думаю, что это могло бы помочь обнаружить эту ошибку:
int faculty(const unsigned int n) {
const unsigned int stop_when_n_leq = 1;
const int return_at_stop = 1;
return n <= stop_when_n_leq ? return_at_stop : n * faculty(n - 1);
}
Маги c числа - это числа в коде без имени. У вас было два 1
, которые казались одинаковыми, но тщательная проверка показывает, что эти два 1
на самом деле являются чем-то другим. Инкремент / уменьшение на единицу настолько распространен, что я не считаю его "волхвами c". Как и с любым эмпирическим правилом, вы должны решить, где его применять, а где нет. Возможно, я бы не назвал константы в такой «простой» функции.