注册 登录
编程论坛 C++教室

请各位指教一下我的编程

lsnpersist 发布于 2009-10-31 19:52, 561 次点击
我初学编程,真的很菜鸟,很多东西都不懂,希望大家不要见怪,虚心指教,小弟感激不尽。下面是我编的一个程序(其实是按照书本编的),主要是红色部分出问题,其实我是特意这样的,想看看效果(要从错误中吸取经验嘛)。请大家指出为什么这样不行。   题目是输出1-5的阶乘值
#include<iostream>
using namespace std;
int fac(int);
int main()
{int i;
for(i=1;i<=5;i++)
cout<<i<<"!="<<fac(i)<<endl;
return 0;
}
int fac(int n)
{static int fac(1)=1;    原来是f=1  f=f*n
fac(n)=fac(n-1)*n;

return f;
}
7 回复
#2
wghost2009-10-31 20:08
你是想用递归?不是这样的吧,这样写试试
int fac(int n)
{
  static long  int m;
  if(n==1)
    m=1;
  else
    m=fac(n-1)*n;
return m;
}
#3
lsnpersist2009-10-31 20:13
回复 2楼 wghost
明白了,谢谢你
#4
最左边那个2009-10-31 20:14
首先,乍一看,这return f,f是什么呢,你没有去定义,这里就出问题了!
另外这里fac(n)=fac(n-1)*n,你这是把一个函数赋给一个函数,用地址还好说,可你这里加了参数就不伦不类了,又会出问题!
你这句吧,static int fac(1)=1,首先没什么必要用到静态,另外你这起到什么作用了呢,你无非是想有个结束条件,可是你这样似乎起不到这样的作用,每次到fac(1),系统又去调用int fac(int),发现里面又有个定义static int fac(1)=1,又遇到fac(1),又调用自身,反反复复,所以就出问题了!

个人理解!
#5
最左边那个2009-10-31 20:18
另外函数(加了参数)作为左式被赋值,慎用!


using namespace std;
int fac(int);
int main()
{int i;
for(i=1;i<=5;i++)
cout<<i<<"!="<<fac(i)<<endl;
return 0;
}
int fac(int n)
{
    if(n==1)
        return 1;
    else
        return n*fac(n-1);

}
#6
lsnpersist2009-10-31 20:21
版主说得很精辟,受教了。谢谢,以后一定多上论坛向各位大虾学习。
#7
lsnpersist2009-10-31 20:30
还有想向大家请教一下,返回值的具体过程是怎样的?  麻烦大家用版主的例子讲解一下当i=1和2时的整个过程  因为我不太懂(return f)的功能
#8
最左边那个2009-10-31 22:57
当遇到  return ***  的时候,*** 可以代表一个数字,一个变量,或者一个式子。如果是式子的话,系统会运算到最简形式。

return 返回作用,比如有main函数里有句cout<<abc(6)<<endl; 当遇到abc(6)的时候,系统会去进入abc函数进行运算,如果函数算到最后是 m=5,return m.

那好,这时候遇到return了,就那执行顺序返回到cout<<abc(6)<<endl的调用点abc(6),而且还返回了abc(6)的结果值,使得原来的cout<<abc(6)<<endl变成cout<<5<<endl;
1