#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使用所谓的词法作用域。这意味着,当你使用变量x
时,你从你所在的块向外看,直到你找到x
的定义,这就是你所指的变量
在f3()
中,您有x
,所以您可以查看您所在的块。x
没有定义,所以你向外看。在这种情况下,向外是全局范围,因为我们在这里没有任何嵌套块。
词汇范围不受哪些函数调用哪些其他函数的影响。它是代码的静态属性,而不是正在运行的代码的动态属性。如果我们使用这种范围规则,它被称为动态范围,那么f3()
中的x
将取决于在任何给定时间调用它的人。因此x
在不同的时间会有所不同。没有多少语言再使用动态作用域了,因为在程序执行的任何时候都很难弄清楚变量指的是什么。
这只是不同的作用域规则,C使用的是词法作用域,而不是动态作用域。
TL;DR因为作用域不会通过函数调用传播。
以下是一些说明范围的块。
scope1
main() {
scope2
function();
}
function() {
scope3
if () {
scope4
}
scope5
}
CCD_ 9是";全局";范围,在您的项目中随处可见。如果你在这里声明任何变量为"0";静态";它们仅在该文件中是已知的。
scope2
在main((的主体中是已知的。main((的主体也知道并可以访问scope1
。
scope3
和scope5
是一样的,function((的主体也知道全局作用域1。function((不知道scope2
,尽管从那里被调用。如果希望scope3
或scope5
了解scope2
的任何信息,则必须将其作为参数传递给function((。
CCD_ 18是CCD_。if的主体知道scope3
和全局scope1
。范围4中声明的任何都会在块末尾丢失,因此scope5
对scope4
一无所知,除非scope4
实际更改了在scope1
或scope3
中声明的变量的值。
当嵌套范围的不同级别中的变量具有相同的名称时,很容易出现混淆应该避免这种情况!