c语言函数返回值问题~!求教

一个c的问题,代码如下
#include <stdio.h>

unsigned int f, x;
unsigned int factorial(unsigned int a);

int main ( void )
{
puts("Enter an integer value between 1 and 33: ");
scanf("%d",&x);

if(x>33 || x<1)
{
printf("Only values from 1 to 33 are acceptable!");
}
else
{
f = factorial(x);
printf("%u factorial equals %u\n",x,f);
}
return 0 ;
}

unsigned int factorial(unsigned int a )
{
if (a == 1)
return 1;
else
{
a *= factorial(a-1);
return a;
}
}
问题:
为什么factorial函数中的return1改为return0结果就为0:改为return 2结果就会变为两倍?
2.这里的return值返回给哪里?
3.这个值返回后如果仍然参与计算,那么程序什么时候停止运行,输出语句?它是怎么判断在何种情况下应该输出?(如:问题1中的若为return1,那么程序会不会一直进行*1的计算,不会停止?)

任何一个函数结束都会返回至调用的地方,例如

……
fun(a);
a++;
……

当fun(a)结束后就会返回调用处,执行下一句a++了。

递归函数是先展开的过程,每次调用新的递归函数就进入下一层,直到遇到终止条件,然后一层层返回。

以你的程序为例,取a=5

factorial(5)
    a(5)*=factorial(5-1)
        a(4)*=factorial(4-1)
            a(3)*=factorial(3-1)
                a(2)*=factorial(2-1)
                    return 1;//返回给factorial(2-1)
                a*=1
                return a //a=2 返会给factorial(3-1)
            a*=2
            return a //a=6 返会给factorial(4-1)
        a*=6
        return a //a=24 返会给factorial(5-1)
    a*=24
    return a;//a=120 返回给main中的 factorial(5)

如果a=1时,返回0,之后所有的a*=0 结果就为0了

如果返回的是2 a*=2 就会是2倍了

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-23

    递归求阶乘函数,最终绝对会出现 ....*factorial(1) ,所以你返回0最终会乘以0,返回2最终会乘以2。自然就是那个结果了。

    return 返回给上一个调用函数也就是factorial函数。

    程序a=1的时候就已经停止了。

    看来你对递归调用不太理解,建议去看看数据结构里的栈,你自然就理解了。

追问

能告诉我这个参数传递的具体路程么?

求助大神关于C语言程序返回值的问题
函数返回值是存在内存栈中的,函数名是在代码段,返回值与参数是在数据段,当函数调用执行时就会将返回值压入栈中,int b=A();相当于调用函数,会将返回值弹出,传递给b.就是这样一个过程。并不是说将返回值返回操作系统,而是放到内存栈中。调用时,再弹出给对应的对象。

c语言函数返回值问题~!求教
……fun(a);a++;……当fun(a)结束后就会返回调用处,执行下一句a++了。递归函数是先展开的过程,每次调用新的递归函数就进入下一层,直到遇到终止条件,然后一层层返回。以你的程序为例,取a=5 factorial(5) a(5)*=factorial(5-1) a(4)*=factorial(4-1) a(3)*=factorial(3-...

问一下c语言函数返回值的问题?
在被调用函数里,任何合理的表达式都可以作为返回值, 表达式的结果就是返回值。 就这个问题而言, c的内容就是返回值。 他有权返回什么跟调用它的函数里的一切都毫无关系。对调用它的函数而言, 相当于在调用的位置写一个常量,这个常量的值就是那个函数的返回值。

C语言中关于“返回值”的问题。知道
B");所有的判断语句的值,都只能是真或假,即true和false。在C里面,可以用1和0分别表示(注意:有些语言中只能用true和false)。y==2也是一个判断语句,如果y= 2,则y==2这个表达式的值就为1,否则就为0。一般来说,返回值是针对于一个函数来说的,对于某一天语句不说返回值。返回值可以是定...

一个关于C语言函数参数和返回值的问题,求大神解答。
传给的那个函数形参应该也是二维数组,或者是二级指针变量 例如:struct stu a[2][3];...fun(a);\/\/fun1的函数原型应该是 void fun(struct stu b[][3]);如果fun有返回值,把void改为和返回值相同类型 或者原型 void fun(struct stu **p);void也依据你的fun是否有返回值做适当修改 ...

[C语言]关于函数返回值的问题。万分感谢!
返回值的概念就是你所调用的函数返回给你的值。函数可以有返回值 ,也可以没有返回值 。例如:当你调用了一个函数时,比如说void fun(int n,int m);前面的void就说明这个函数是没返回值的。只要在前面出现了一个void就是没有返回值的。再者,当你调用了函数,比如int fun(int m);时,前面的...

关于C语言函数返回值的问题,请大神帮帮忙
int n2(Bitree bt)函数,返回值是int型,而你的函数体内,有5个if的条件判断语句,那么试想如果if的条件判断全都不满足,即全都为假的时候,那么一个if都不会执行。所以if语句里的return语句能执行到吗?当然不行了!因此你应该在int n2(Bitree bt)体的尾部加一句return语句,比如你想默认是返回...

c语言中,函数返回值怎么用?
return后接一个值。\\r\\n在调用这个函数的函数里面,调用它的时候希望获得一个值,如果不希望获得这个值的时候,用void声明就好。如果需要,比如说需要得到一个整形值\\r\\n就声明\\r\\nint func()\\r\\n在调用它的比如main里面\\r\\nfunc()的作用就可以相当于一个int型常数\\r\\n比如外面定义了\\r\\nint ...

C语言函数返回值问题
returm1; 返回1 如果这两句连起来用的话,返回0,后面的不会执行 函数都会有返回值,这个份两大类,一个是主函数,一个是子函数 第一大类是主函数,也就是main函数的返回值,main也会有返回值,但是很少不会用到,一般来说大家都会忽略掉,一般来说不讨论 但是在vc等编译器中,好像是要求写...

请教c语言中返回值的问题,为什么有的程序有定义调用的函数无RETURN还是...
&a);指针为形参。如int b(int*a);按引用的特点:形参改变后,实参也变!即形参的值改变,实参也变!另外,按引用实际上是通过参数的内存地址提取参数的值去进行操作!所以有时没有return 照样改变!return的作用:返回值函数需要一个返回语句,它是用return关键字将结果返回!希望对你有帮助!

相似回答