我对这个代码结果有点困惑:
#include <stdio.h>
int g;
void afunc(int x)
{
g = x; /* this sets the global to whatever x is */
}
int main(void)
{
int g = 10; /* Local g is now 10 */
afunc(20); /* but this function will set it to 20 */
printf("%dn", g); /* so this will print "20" */
return 0;
}
为什么结果是10而不是20?
局部变量g
遮蔽全局g
。
如果你想让printf()
显示20,你必须用你想打印的全局变量的声明来遮蔽你的局部变量g
:
int main(void)
{
int g = 10; /* Local g is now 10 */
afunc(20); /* Set global g to 20 */
printf("%dn", g); /* Print local g, "10" */
{
extern int g; /* Use global g */
printf("%dn", g); /* Print global g, "20" */
}
return 0;
}
调用afunc
将更改全局g
,而main
将保留其本地g
。
输入函数不会将其作用域与全局作用域交换。每个函数*都有自己的作用域。
*除其他外
如果在中去掉int
int g = 10;
那么main也将引用与CCD_ 10相同的全局变量。
这被称为可变阴影
没有修改您的代码,但已经调整了注释以指示代码正在做什么。顺便说一句,评论你的代码是一个非常好的主意,可以提高实验室成绩!!签约,前毕业生TA
#include <stdio.h>
int g; /* define a global variable
void afunc(int x)
{
g = x; /* this sets the global to whatever x is */
}
int main(void)
{
int g = 10; /* Define and set a Local g to 10 */
afunc(20); /* This function sets global x to 20 */
printf("%dn", g); /* this prints local g "10" */
return 0;
}
想想这种从主存储到全局存储的"查找"。在全局g之前可以看到局部g,因此使用了局部g。
在这两种情况下,尽管变量名称看起来相同,但它们引用了两个不同的内存区域。在任意函数外部声明的变量g存储在RAM存储区中,在main内部声明的变量g存储在堆栈区中。因此,afunc()的调用是更改存储在RAM中的变量g,但再次打印本地声明的变量g(存储在堆栈中)。