我在Python中有一点编程经验,为了好奇,我开始学习C语言,至少是非常基础的东西。在一个教程,我发现了一个示例函数用于计算阶乘,这是这样的:C教程中的这个阶乘函数是错误的吗?
int factorial(int x)
{
int i;
for(i=1; i < x; i++)
{
x *= i;
}
return x;
}
我也为了增加这些线看的输出:
#include <stdio.h>
int main()
{
int val;
val = factorial(5);
printf("%d\n",val);
return 0;
}
然后我编译的代码与gcc factor.c -o factor.out
,运行和... ooops,结果是-1899959296
,显然有错误。
一个尝试几次后,使用printf()
同时打印i
和x
,我想通了,出了什么问题(我认为):自从for
回路检查的情况,如果该计数器小于x
,然后在每一步x
变得越来越大,i
总是小于x
,所以循环继续进行,大概在x
的值太大时停止(这应该与int
有关,对于各种数据类型我还不是很熟悉)。
所以,“解决”的问题,我改写这样的功能:
int factorial(int x)
{
int counter = x;
int number = x;
int i;
for (i=1; i < counter; i++)
{
number *= i;
}
return number;
}
予编译程序,运行和打印的值是120,它是正确的。
我在C中搜索了一些有关阶乘函数的例子,并且发现了许多比我更好的解决方案,考虑到负数和格式如long
等等,但是所有这些都以某种方式似乎依靠两个“主要”变量,就像我的解决方案。
所以,最后一个问题:是提出的例子错了,还是我错过了什么?这真让我困扰,因为如果这样一个简单的例子是明显错误的,我应该质疑其余的可信度。
找一个C的书和阅读有关'INT_MAX'等 – Olaf
'如果这样一个简单的例子是公然错误的,我应该质疑其余的可信度。“ - 是的,绝对。不是因为他们弄错了一件简单的事情,而是因为他们在发布之前没有测试过他们的东西。 – Siguza
为什么downvote?这个问题是完整的,我没有理由认为它应该被视为脱离主题。 – alk