[英]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 规则,它被称为动态 scope , f3()
中的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
。
scope3
和scope5
是一样的,function() 的主体也知道全局 scope1。 function() 不知道scope2
,尽管是从那里调用的。 如果您希望scope3
或scope5
了解有关scope2
的任何信息,则必须将其作为参数传递给 function()。
scope4
是if
的主体。 if 的主体知道scope3
和全局scope1
。 在 scope4 中声明的任何内容都会在块的末尾丢失,因此scope5
不知道有关scope4
的任何信息,除非scope4
实际上更改了在scope1
或scope3
中声明的变量的值。
当嵌套 scope 的不同级别中的变量具有相同的名称时,很容易出现混淆。 应该避免这种情况!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.