C编程文件范围和块范围

  • 本文关键字:范围 文件 编程 c
  • 更新时间 :
  • 英文 :

#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

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

CCD_ 18是CCD_。if的主体知道scope3和全局scope1。范围4中声明的任何都会在块末尾丢失,因此scope5scope4一无所知,除非scope4实际更改了在scope1scope3中声明的变量的值

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

最新更新