关于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语言后台病毒程序的代码怎么写?