我对此代码结果感到有些困惑:
#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("%d\n", g); /* so this will print "20" */
return 0;
}
为什么结果是10不是20?
答案 0 :(得分:6)
局部变量g
会影响全局g
。
如果您希望printf()
显示20,则必须使用您要打印的全局变量声明来隐藏您的本地变量g
:
int main(void)
{
int g = 10; /* Local g is now 10 */
afunc(20); /* Set global g to 20 */
printf("%d\n", g); /* Print local g, "10" */
{
extern int g; /* Use global g */
printf("%d\n", g); /* Print global g, "20" */
}
return 0;
}
答案 1 :(得分:5)
致电afunc
会更改全局g
,main
会保留其本地g
。
输入函数不会将其范围与全局范围交换。每个函数*都有自己的范围。
*除其他外
答案 2 :(得分:2)
答案 3 :(得分:1)
没有修改您的代码,但已调整您的注释以指示代码正在执行的操作。顺便说一句,评论您的代码是一个非常好的主意,并提供更好的实验室分数!签署,前毕业生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("%d\n", g); /* this prints local g "10" */
return 0;
}
考虑从主存储到全局存储的“查找”。你在全局g之前看到局部g,因此使用了局部g。
答案 4 :(得分:0)
在这两种情况下,尽管变量名称看起来相同,但它们指的是2个不同的存储区域。在任何函数外部声明的变量g都存储在RAM存储区中,而在main中声明的变量g存储在堆栈区域中。因此, afunc()的调用正在改变存储在RAM中的变量g,但是再次打印在本地声明的变量g(存储在堆栈中)。