Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 重新定义的全局变量_C_Global Variables_Local Variables - Fatal编程技术网

C 重新定义的全局变量

C 重新定义的全局变量,c,global-variables,local-variables,C,Global Variables,Local Variables,我对这个代码结果有点困惑: #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 */ prin

我对这个代码结果有点困惑:

#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;
}
#包括
int g;
无效afunc(整数x)
{
g=x;/*这将全局值设置为x是什么*/
}
内部主(空)
{
int g=10;/*本地g现在是10*/
afunc(20);/*但此函数将其设置为20*/
printf(“%d\n”,g);/*所以这将打印“20”*/
返回0;
}

为什么结果是10而不是20?

调用
afunc
更改全局
g
,而
main
保留其局部
g

输入函数不会将其作用域与全局作用域交换。每个函数*都有自己的作用域


*除此之外

如果您在

int g = 10;
然后main还将引用与
afunc
is相同的全局变量


这被称为

局部变量
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;
}

未修改代码,但已调整注释以指示代码正在执行的操作。顺便说一句,评论你的代码是一个非常好的主意,有助于提高实验成绩!!签名,前助教毕业生

#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;
}
#包括
int g;/*定义一个全局变量
无效afunc(整数x)
{
g=x;/*这将全局值设置为x是什么*/
}
内部主(空)
{
int g=10;/*定义并将本地g设置为10*/
afunc(20);/*此函数将全局x设置为20*/
printf(“%d\n”,g);/*这将打印本地g“10”*/
返回0;
}

考虑一下从主存储到全局存储的“查找”。您在全局g之前看到了局部g,因此使用了局部g。

在这两种情况下,虽然变量名称看起来相同,但它们2指的是2个不同的内存区域。在任何函数外部声明的变量g存储在RAM内存区域中,在main内部声明的变量g存储在堆栈区域中。因此,调用afunc()会更改存储在RAM中的变量g,但会再次打印本地声明的变量g(存储在堆栈中)。

因为主要的“g”与全局的“g”不同。@H2CO3:C标准说内部名称隐藏了另一个名称。它把它隐藏起来;没有阴影。@EricPostphil:虽然它在OOP中通常意味着不同的东西,但在C中有区别吗?(似乎认为这没问题,但话说回来,它并非总是正确的。)Shadow是GCC使用的术语,通过将
-Wshadow
传递给编译器可以发现条件的存在。