C语言中,局部变量和全局变量的问题
我想问问题1:可不可以这样理解,f1,f2中没有定义局部变量,本题中直接操作的都是局部变量x。问题2:局部变量x仅在main函数中有效,f1,f2,可以直接拿来用吗?in...
我想问
问题1:可不可以这样理解,f1,f2中没有定义局部变量,本题中直接操作的都是局部变量x。
问题2:局部变量x仅在main函数中有效,f1,f2,可以直接拿来用吗?
int x=1;
void f1()
{
x++;
}
void f2()
{
x=5;
}
int main(void)
{
x=10;
f1();
printf("%d\n",x);
f2();
printf("%d\n",x);
return 0;
}
f1,f2中没有定义局部变量,操作的都是main中的局部变量x,是吗 展开
问题1:可不可以这样理解,f1,f2中没有定义局部变量,本题中直接操作的都是局部变量x。
问题2:局部变量x仅在main函数中有效,f1,f2,可以直接拿来用吗?
int x=1;
void f1()
{
x++;
}
void f2()
{
x=5;
}
int main(void)
{
x=10;
f1();
printf("%d\n",x);
f2();
printf("%d\n",x);
return 0;
}
f1,f2中没有定义局部变量,操作的都是main中的局部变量x,是吗 展开
展开全部
解答问题前,先说明一下,当全局变量和局部变量同名时,要看当前代码所处的作用域,默认使用当前作用域内的同名局部变量。
分析你所提供的代码:
#include
int a = 4;
//全局变量
int f(int n)
{
int t = 0;
static int a = 5;
//局部静态变量
if( n%2 )
{
int a = 6;
// if作用域内局部变量
t += a++;
// 此处的a是指if作用域内的局部变量,该变量在作用
// 域结束后,生存周期结束。
}
else
{
int a = 7; // else作用域内局部变量
t += a++;
// 此处的a是指else作用域内的局部变量
// 作用域结束后,生存周期结束
}
return t+a++;
// 此外的a是指f函数作用域内的静态局部变量,
// 每次f函数调用return后,此静态局部变量a自增1
}
int main ( void )
{
int s=a, i=0;
// 根据作用域,此处的a是指全局变量,所以s初始值为4
for(;i<2;i++) s+=f(i);
printf("%d\n",s);
return 0;
}根据以上,分析运行流程:
由上可知,s初始值为4;
当i=0时,第一次循环,调用f()函数,由于0%2为0,会进入else后代码,此时t=0+7=7,调用f()函数的return时,会返回7+5=12,同时f()函数的静态局部变量a由5变为6(下次调用生效),s=4+12=16。
当i=1时,第二次循环,调用f()函数,由于1%2为1,会进入if后代码,此时t=0+6=6,调用f()函数的return时,会返回6+6=12,同时f()函数的静态局部变量a由6变为7(下次调用生效),s=16+12=28。
当i=2时,循环终止,打印s值为28。
关于最后的问题,是因为f()函数中if后面的变量a作用域只限制在if后的花括号内,代码退出该作用域后,该变量生存周期结束而被释放,return中使用的a是f()函数中定义的静态局部变量a,所以,不管前者如何赋值,对return中的a没有影响。
分析你所提供的代码:
#include
int a = 4;
//全局变量
int f(int n)
{
int t = 0;
static int a = 5;
//局部静态变量
if( n%2 )
{
int a = 6;
// if作用域内局部变量
t += a++;
// 此处的a是指if作用域内的局部变量,该变量在作用
// 域结束后,生存周期结束。
}
else
{
int a = 7; // else作用域内局部变量
t += a++;
// 此处的a是指else作用域内的局部变量
// 作用域结束后,生存周期结束
}
return t+a++;
// 此外的a是指f函数作用域内的静态局部变量,
// 每次f函数调用return后,此静态局部变量a自增1
}
int main ( void )
{
int s=a, i=0;
// 根据作用域,此处的a是指全局变量,所以s初始值为4
for(;i<2;i++) s+=f(i);
printf("%d\n",s);
return 0;
}根据以上,分析运行流程:
由上可知,s初始值为4;
当i=0时,第一次循环,调用f()函数,由于0%2为0,会进入else后代码,此时t=0+7=7,调用f()函数的return时,会返回7+5=12,同时f()函数的静态局部变量a由5变为6(下次调用生效),s=4+12=16。
当i=1时,第二次循环,调用f()函数,由于1%2为1,会进入if后代码,此时t=0+6=6,调用f()函数的return时,会返回6+6=12,同时f()函数的静态局部变量a由6变为7(下次调用生效),s=16+12=28。
当i=2时,循环终止,打印s值为28。
关于最后的问题,是因为f()函数中if后面的变量a作用域只限制在if后的花括号内,代码退出该作用域后,该变量生存周期结束而被释放,return中使用的a是f()函数中定义的静态局部变量a,所以,不管前者如何赋值,对return中的a没有影响。
展开全部
只有void
countValue()里的cnt是局部变量,而sum还是全局变量,
而printf里输出的全是全局变量的值(因为局部变量只在countValue函数里其作用,在这个函数里全局变量sum被重新赋值为0,在sum++后,在printf打印出来的就是1了)
你可以把int
cnt=0;sum=0;改成int
cnt=0;int
sum=0;看看,输出的就全是6了
countValue()里的cnt是局部变量,而sum还是全局变量,
而printf里输出的全是全局变量的值(因为局部变量只在countValue函数里其作用,在这个函数里全局变量sum被重新赋值为0,在sum++后,在printf打印出来的就是1了)
你可以把int
cnt=0;sum=0;改成int
cnt=0;int
sum=0;看看,输出的就全是6了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int
cnt=0;sum=0;要是这里没有错的话,就是cnt=0后面是分号,那么sum一定会输出1
因为sum是全局变量
cnt在子函数中时局部变量,所以cnt是不会改变的
cnt=0;sum=0;要是这里没有错的话,就是cnt=0后面是分号,那么sum一定会输出1
因为sum是全局变量
cnt在子函数中时局部变量,所以cnt是不会改变的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、f1和f2操作的是全局变量x
2、局部变量仅在定义的函数中有效,所以f1和f2是不可能访问的。同时局部变量会覆盖掉同名的全局变量,如果需要使用同名的全局变量,需要使用域运算符::。
即main函数中printf的x是局部变量,而f1和f2操作是全局变量x。
2、局部变量仅在定义的函数中有效,所以f1和f2是不可能访问的。同时局部变量会覆盖掉同名的全局变量,如果需要使用同名的全局变量,需要使用域运算符::。
即main函数中printf的x是局部变量,而f1和f2操作是全局变量x。
更多追问追答
追问
那调用f1,f2的时候,是怎样的一个过程呢?
追答
调用f1和f2,都是给全局变量x赋值就可以了。楼主说的过程是什么意思?
f1和f2也没有参数,对main函数完全无影响呀。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-03-25
展开全部
是的,main中的x,可以被f1和f2使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询