繁体   English   中英

C 编程全局和局部 scope

[英]C programming global and local scope

#include<stdio.h>

int f1(void);
int f2(void);
int f3(void);

int x = 10;

int main()
{
    int x =1;
    x+=f1() + f2() + f3() + f2();
    printf("%d", x);
    return 0;
}

int f1()
{
    int x = 25;
    x++;
    return x;
}
int f2()
{
    static int x= 50; 
    x++; 
    return x;
}

int f3()
{
    x*=10; 
    return x;
}

为什么 f3 采用全局 x 变量? 我的意思是 main 正在调用 f3 并且在 main 我们有 x 变量,为什么 f3 不采用 main x 变量的值。 请帮忙

C 使用所谓的词法scope。 这意味着当您使用变量x时,您会从您所在的块向外查看,直到找到x的定义,然后,这就是您所指的变量。

f3()中,您有x ,因此您可以查看您所在的块。 x没有定义,所以你向外看。 在这种情况下,向外是全局 scope,因为我们这里没有任何嵌套块。

词法 scope 不受哪些函数调用哪些其他函数的影响。 它是代码的 static 属性,而不是运行代码的动态属性。 如果我们使用这种 scope 规则,它被称为动态 scopef3()中的x将取决于在任何给定时间调用它的人。 所以x在不同的时间会有所不同。 不再使用动态 scope 的语言已经不多了,因为在程序执行的任何时候都很难弄清楚变量指的是什么。

它只是不同的 scope 规则,而 C 使用词法 scope 而不是动态 Z31A1FD140BE4BEF2D181E158Z1

TL;DR因为scope不会通过 function 调用传播。

以下是一些说明 scope 的块。

scope1

main() {
    scope2
    function();
}

function() {
    scope3
    if () {
        scope4
    }
    scope5
}

scope1是一个“全局”scope,在您的项目中随处可见和可访问。 如果您在此处将任何变量声明为“静态”,则它们仅在该文件中是已知的。

scope2在 main() 的主体中是已知的。 main() 的主体也知道并可以访问scope1

scope3scope5是一样的,function() 的主体也知道全局 scope1。 function() 不知道scope2 ,尽管是从那里调用的。 如果您希望scope3scope5了解有关scope2的任何信息,则必须将其作为参数传递给 function()。

scope4if的主体。 if 的主体知道scope3和全局scope1 在 scope4 中声明的任何内容都会在块的末尾丢失,因此scope5不知道有关scope4的任何信息,除非scope4实际上更改了在scope1scope3中声明的变量的值。

当嵌套 scope 的不同级别中的变量具有相同的名称时,很容易出现混淆。 应该避免这种情况!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM