当前位置:编程学习 > C/C++ >>

关于C语言变量存储类型的问题

#include<stdio.h>
int i=1;
int reset()
{
 return i;
}
void main()
{
 int i,j;
 i=reset();
 for(j=1;j<=3;j++)
 {
  printf("i=%d,j=%d\n",i,j);
  printf("next(i)=%d\n",next(i));
  printf("last(i)=%d\n",last(i));
  printf("new(i+j)=%d\n",new(i+j));
 }   
}
int next(int j)
{
 return j=i++;
}
int last(int j)
{
 static int i=10;
 return j=i--;
}
int new(int i)
{
 int j=10;
 return i=j+=i;
}

 

以上程序中,开始已经定义了全局变量i,而main函数中又有个i的声明,有什么作用呢?

然后在new函数中传入了i的值,全局变量在这里起作用?

求运行结果及详细解释。谢谢。

追问:清楚,详细,明白。谢谢。

另外还有个问题要问一下:写出计算Ackermann函数Ack(m,n)的递归计算函数。对于m>=0,n>=0,Ack(m,n)定义为Ack(0,n)=n+1

Ack(m,0)=Ack(m-1,1)

Ack(m,n)=Ack(m-1,Ack(m,n-1)),m>0,n>0

要求显示计算过程。

我是这样来的:

int Ack(int m,int n)

{

       if(m==0)

       {

              printf("Ack(%d,%d)=%d\n",m,n,n+1);

              return n+1;

       }

       else if(n==0)

       {

              printf("Ack(%d,%d)=Ack(%d,%d)\n",m,n,m-1,1);

              return Ack(m-1,1);

       }

       else if(m>0 && n>0)

              printf("Ack(%d,%d)=Ack(%d,Ack(%d,%d))\n",m,n,m-1,m,n-1);

              return Ack(m-1,Ack(m,n-1));

}

 不知道你对“显示计算过程”有什么更好的想法。期待你回答。

答案:#include<stdio.h>
int next(int j);
int last(int j);
int new(int i);
int i=1;
int reset()
{
 return i;//全局i
}
void main()
{
 int i,j;
 i=reset();/*调用的函数使用了i,没带参(没把i作为实参)时使用的i是全局的,此时局部变量i=1,全局i=1  */
 for(j=1;j<=3;j++)
 {
  printf("i=%d,j=%d\n",i,j);/*此处使用的是局部变量i,输出i=1,j=1  */
  printf("next(i)=%d\n",next(i));/*调用函数,并且带实参i,为局部变量的i;返回值为1,输出next(i)=1  */
  printf("last(i)=%d\n",last(i));/*调用函数;返回值为10, 输出last(i)=10 */
  printf("new(i+j)=%d\n",new(i+j));/*调用函数;返回值为12,输出12  */
 }    /*继续循环同样的分析方法,不同的地方就是last(int j)中的静态变量i不会在定义一次赋值为10,第二次调用变成了9,第三次变成了8……(即static int i=10的赋初值仅第一次有用)*/
}
int next(int j)
{
 return j=i++;/*++在右边,计算时把i赋值给j=i=1,再i自加一次,这样运算也改变了i的值,这个函数中未定义局部i,则此处的i为全局变量,全局i=2  */
}
int last(int j)
{
 static int i=10;//静态变量,只初始化一次
 return j=i--; //此处使用的是局部变量i,赋值给j后自减一次,此时这个子函数的局部变量i=9并一直存在,返回10,实参不起作用*/
}
int new(int i)
{
 int j=10;
 return i=j+=i;//先进性运算j+=i;即10+=2,赋值给i返回,该i为一个形参传递,不是main函数中的i也不是全局的i,但是它是main中的局部i+j=2的值赋值给它的,返回12*/
}

局部变量取代了全局变量,所以当在同一个作用域的范围内,对重命名i的调用将屏蔽全局变量i,所以全局变量在这里没有任何作用 ,这种声明全局了又在局部声明相同的变量不推荐

上一个:C语言简单试题,高分求答案?
下一个:C语言后台病毒程序的代码怎么写?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,