首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试理解此C程序中静态作用域和动态作用域之间的区别

静态作用域和动态作用域是两种不同的变量作用域规则。

静态作用域(也称为词法作用域)是在编译时确定的,变量的作用域是由代码的结构决定的。在静态作用域中,一个变量的作用域是在定义它的代码块内以及所有嵌套的代码块内。无论函数在何处调用,它的作用域都是相同的。静态作用域可以在编译时进行优化,因为变量的作用域是固定的。

动态作用域是在运行时确定的,变量的作用域是由程序的执行路径决定的。在动态作用域中,一个变量的作用域是在调用它的代码块内以及所有被该代码块调用的代码块内。动态作用域可以根据程序的执行情况动态地改变变量的作用域。

下面是一个示例C程序,用于演示静态作用域和动态作用域之间的区别:

代码语言:txt
复制
#include <stdio.h>

int x = 1;

void foo() {
    int x = 2;
    printf("foo: %d\n", x);
}

void bar() {
    printf("bar: %d\n", x);
}

int main() {
    foo();
    bar();
    return 0;
}

在这个程序中,变量x在全局范围内定义为1。函数foo中定义了一个局部变量x并赋值为2。函数bar中打印了全局变量x的值。

根据静态作用域的规则,函数foo中的变量x的作用域仅限于foo函数内部。因此,当调用foo函数时,它打印的是局部变量x的值2。

根据动态作用域的规则,函数bar中的变量x的作用域是在调用它的代码块内,即main函数内。因此,当调用bar函数时,它打印的是全局变量x的值1。

综上所述,静态作用域和动态作用域之间的区别在于变量作用域的确定时机不同。静态作用域在编译时确定,而动态作用域在运行时确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

cc++区别 (四)动态内存开辟、cc++作用

一、动态内存开辟 C:malloc,free C++:new,delete。new底层调用任然是malloc,但相对于malloc,new具有初始化功能。...C++作用 C作用: (1)全局作用 (2)局部作用 C++作用: (1)局部作用 (2)类作用 (3)名字空间作用namespace,又分为局部名字作用全局名字作用...,一次只能声明一个符号 using MyName::data; using MyName::sum; using namespace MyName;//声明整个名字空间MyName符号 int main...(){ int data=30; cout<<data<<endl;//优先使用局部 cout<<::data<<endl;//::全局作用符号 cout<<MyName::data<<endl...;//MyName名字空间 } 在名字空间定义变量好处是,可以在不同作用定义同名变量,而不致引起冲突。

41220

深入理解 JavaScript 作用上下文

虽然对于许多新手开发者来说,作用概念并不是很容易理解,我会尽我所能用最简单方式来解释作用理解作用将使你代码脱颖而出,减少错误,并帮助您使用它强大设计模式。...什么是作用(Scope)? 作用是在运行时代码某些特定部分变量,函数对象可访问性。换句话说,作用决定了代码区块变量其他资源可见性。 为什么说作用是最小访问原则?...05词法作用 词法作用意味着在一组嵌套函数,内部函数可以访问其父级作用域中变量其他资源。这意味着子函数在词法作用上绑定到他们父级执行期上下文。词法作用有时也被称为静态作用。...但是在JavaScript,没有公共或私有作用。幸好,我们可以使用闭包来模拟功能。...hello.call(context); // 在这里你可以传递上下文(this 值)作为第一个参数 hello.apply(context); .call().apply()之间区别在于

1.3K10
  • 内存分配——静态存储区 栈 堆 与static变量

    1)内存位置:静态存储区(静态存储区在整个程序运行期间都存在) 2)初始化:未经初始化全局静态变量会被程序自动初始化为0(自动对象值是 任意,除非他被显示初始化) 3)作用:全局静态变量在声明他文件之外是不可见...1)内存位置:静态存储区 2)初始化:未经初始化局部静态变量会被程序自动初始化为0(自动对象值是任意,除非他被显示初始化) 3)作用作用仍为局部作用,当定义它函数或者语句块结束时候...但是局部静态变量在离开作用之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。   ...当static用来修饰全局变量时候,它就改变了全局变量作用(在声明他文件之外是不可见),但是没有改变它存放位置,还是在静态存储区。...、 三、三者之间区别 我们通过代码段来看看对这样三部分内存需要怎样操作和不同,以及应该注意怎样地方。

    1.9K30

    C++ 炼气期之变量生命周期作用

    变量生命周期变量作用是有区别的。就如同你家里养花开了 1 个月,但只有你家里人才能闻到花香,花园里花只开了 1 天,但是,公园里所有人都能闻到花香。...共享性:指变量数据是否能让其它代码可见、可用。 局部变量局部含义可以理解为不共享,作用范围只供自己使用,。...main函数第一次声明 temp变量实际作用是整个 main函数,但是,当执行到内部代码块时,发现代码块 temp变量代码块外变量 temp同名。此时C++如何处理这种情况?...而在C++ 11语义是显示指定变量为自动存储,以前 auto 功能相同。...总结 声明变量时,存储类别决定了变量生命周期。 生命周期指变量存活时间,作用指变量能在一个什么范围之内被使用。两者之间有很明显区别,本文聊到了自动存储类型和静态存储类别的变量。

    92630

    C++函数重载、隐藏、覆盖重写区别

    a:b; } 1.3注意事项 (1)函数返回值类型与构成函数重载无任何关系; (2)类静态成员函数与普通成员函数可以形成重载; (3)函数重载发生在同一作用,如类成员函数之间重载、全局函数之间重载...《C++高级进阶教程》认为函数隐藏与覆盖是两个不同概念。隐藏是一个静态概念,它代表了标识符之间一种屏蔽现象,而覆盖则是为了实现动态联编,是一个动态概念。...C++函数重载隐藏覆盖区别,并不难,难就难在没弄清定义,被网上各种说法弄云里雾里而又没有自己理解。...在这里,牢记以下几点,就可区分函数重载、函数隐藏、函数覆盖函数重写区别: (1)函数重载发生在相同作用; (2)函数隐藏发生在不同作用; (3)函数覆盖就是函数重写。...关于三者对比,李健老师在《编写高质量代码:改善C++程序150个建议》给出了较为详细总结,如下表所示: 三者 作用 有无virtual 函数名 形参列表 返回值类型 重载 相同 可有可无 相同

    8.2K62

    static在CC++用法区别

    该类型局部变量存储在栈上,在动态存储区,生命周期仅限于定义它函数,函数结束,它就自动释放。static类型局部变量存储在静态存储区,在程序整个运行期间都不释放。...两者之间作用相同,但生存期不同。 2. static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。 3....在这里面, static既不是限定作用, 也不是扩展生存期作用, 而是指示变量/函数在此类唯一性. 这也是”属于一个类而不是属于此类任何特定对象变量函数”含义....在C++extern还有另外一种作用,用于指示C或者C++函数调用规范。比如在C++调用C库函数,就需要在C++程序中用extern “C”声明要引用函数。...这是给链接器用,告诉链接器在链接时候用C函数规范来链接。主要原因是C++C程序编译完成后在目标代码命名规则不同,用来解决名字匹配问题。

    2.7K10

    JavaScript——作用闭包

    作用有两大类别: 静态作用 指标识符作用范围是由标识符声明位置程序结构决定,也就是说某段代码所参照标识符是在哪定义,通过对程序代码进行词法解析即可确定,标识符作用静态不变。...动态作用 指标识符作用范围是由程序运行时函数调用情况决定,也就是说某段代码所参照标识符是在哪定义,需在程序运行时根据执行栈才能确定,标识符作用可能会是动态变化。...以下面的代码为例,我们来简单看一下两者区别各自特点。...支持静态局部作用语言比较少,基本上都是一些历史比较悠久语言,如 C/C++、Fortran 等。 JavaScript 不存在静态局部作用。...作用链 JavaScript 作用链有两种: 一种是函数创建时保存在函数对象属性静态存在作用链,还有一种是程序执行时,与执行上下文相关联动态存在作用链,下面对这两种作用链分别进行说明

    71610

    还担心面试官问闭包?

    篇文章总结与《JavaScript忍者秘籍》 《你不知道JavaScript上卷》 前言 为什么我们需要理解并且掌握闭包,且不说大道理,就问你要不要成为JavaScript高手?不要?...其中包含标识符:foo 部分二包含foo所创建作用,其中包含:a,barb 部分三包含bar所创建作用,其中包含:c 这些作用气泡包含关系给引擎提供了足够多位置信息。...在上面的代码,引擎执行console.log时候,并查找a,b,c。他首先在最里面的作用,也就是bar(...)函数作用。...词法作用查找只会查找一级标识符,比如a,bc。...因为JavaScript没有动态作用,而闭包本质是静态作用静态作用规则查找一个变量声明时依赖是源程序之间静态关系),所以函数访问都是我们定义时候作用,也就是词法作用

    46810

    PHP之static静态变量详解(一)

    什么是static静态变量?(以下为在C语言中理解静态变量 类型说明符是static。...静态变量虽在程序整个执行过程始终存在,但是在它作 用之外不能使用。 另外,属于静态存储方式变量不一定就是静态变量。...这两者区别虽在于: 1、非静态全局变量作用是整个源程序,当一个源程序由多个源文件组成时,非静态全局变量在各个源文件中都是有效。...2、静态全局变量则限制了其作用, 即只在定义该变量源文件内有效,在同一源程序其它源文件不能使用它。...static静态变量会被放在程序全局存储区(即在程序全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用时候还可以保持原来赋值。这一点是它与堆栈变量堆变量区别

    2.3K31

    还担心面试官问闭包?

    篇文章总结与《JavaScript忍者秘籍》 《你不知道JavaScript上卷》 前言 为什么我们需要理解并且掌握闭包,且不说大道理,就问你要不要成为JavaScript高手?不要?...其中包含标识符:foo 部分二包含foo所创建作用,其中包含:a,barb 部分三包含bar所创建作用,其中包含:c 这些作用气泡包含关系给引擎提供了足够多位置信息。...在上面的代码,引擎执行console.log时候,并查找a,b,c。他首先在最里面的作用,也就是bar(...)函数作用。...词法作用查找只会查找一级标识符,比如a,bc。...因为JavaScript没有动态作用,而闭包本质是静态作用静态作用规则查找一个变量声明时依赖是源程序之间静态关系),所以函数访问都是我们定义时候作用,也就是词法作用

    40820

    总结一些前端知识点 (一)

    一、W3C 标准盒模型 IE 盒模型区别: 1. W3C 标准盒模型: 盒子高宽是由盒子内容区仅由 width, height 决定,不包含边框,内外边距。 2....四、动态作用静态作用区别静态作用又称之为词法作用:即词法作用函数遇到既不是形参也不是函数内部定义局部变量变量时,它会根据函数定义环境查询。...,在上述代码中会打印出 1 而非 2,因为 static 函数在作用创建时候,记录 foo 是 1,如果是动态作用的话,那么它应该打印出 2 静态作用是产生闭包关键,即它在代码写好之后就被静态决定它作用了...动态函数遇到既不是形参也不是函数内部定义局部变量变量时,到函数调用环境去查询 在 JS ,关于 this 执行是基于动态查询,下面这段代码打印出 1,如果按静态作用的话应该会打印出...,因为数组就像对象一个子集一样,但是函数与对象之间,却不仅仅是包含被包含关系。

    79970

    C语言中,全局变量滥用后果竟如此严重?

    全局变量是可以被本程序所有对象或函数引用。 从作用看: 全局变量具有全局作用。全局变量只需在一个源文件定义,就可以作用于所有的源文件。...静态全局变量也具有全局作用,他与全局变量区别在于如果程序包含多个文件的话,他作用于定义它文件里,不能作用到其他文件里,即被static关键字修饰过变量具有文件作用。...区别在于非静态全局变量作用是整个源程序,当一个源程序由多个源文件组成时,非静态全局变量在各个源文件中都是有效。...而静态全局变量则限制了其作用,即只在定义该变量源文件内有效,在同一源程序其他源文件不能使用它。...1、静态变量会被放在程序静态数据存储区里,这样可以在下一次调用时候还可以保持原来赋值。这一点是他与堆栈变量堆变量区别 2、变量用static告知编译器,自己仅仅在变量作用范围内可见。

    1.4K20

    学习一下JavaScript

    那么我们该怎么表示实例与实例原型,也就是 person Person.prototype 之间关系呢,这时候我们就要讲到第二个属性: 按照原作者观点: 因为C++里面的是类声明函数声明有本质区别...作用 原话>> 作用是指程序源代码定义变量区域。 作用规定了如何查找变量,也就是确定当前执行代码对变量访问权限。...静态作用动态作用 原话>> 因为 JavaScript 采用是词法作用,函数作用在函数定义时候就决定了。 而与词法作用相对动态作用,函数作用是在函数调用时候才决定。...所以C++也是静态作用,在函数被定义时候,函数作用就已经确定好了 原话>> 假设JavaScript采用静态作用,让我们分析下执行过程: 执行 foo 函数,先从 foo 函数内部查找是否有局部变量...看来在静动态作用这个问题上JavaScriptC++还是保持高度一致。??? 动态作用 原话>> 也许你会好奇什么语言是动态作用

    39810

    C++内存布局

    2.5 堆区(heap)堆是一个大容器,它容量要远远大于栈,但没有栈那样先进后出顺序。用于动态内存分配。堆在内存位于BSS区栈区之间。...相反关键字是extern,使用extern修饰或者什么都不带全局对象作用是整个程序。...a、b、c、d、e、pi存储类别生命期如下所述:a是一个未初始化全局变量,作用为整个程序,生命期是整个程序运行期间,在内存bss段b是一个未初始化静态全局变量,作用为本源文件,生命期是整个程序运行期间...,在内存bss段c是一个未初始化局部变量,作用为函数func体内,即仅在函数体内可见,生命期也是函数体内,在内存d是一个未初始化静态局部变量,作用为函数func体内,即仅在函数体内可见,...sizeof(int),pi本身存储在内存,生命期是main函数内新申请内存块在堆,生命期是malloc/free之间图解如下图片加深记忆再次理解图片变量作用生命周期储存位置图片测试作用

    365101

    static作用(修饰函数、局部变量、全局变量)

    这两者区别在于非静态全局变量作用是整个源程序, 当一个源程序由多个源文件组成时,非静态全局变量在各个源文件中都是有效。...而静态全局变量则限制了其作用, 即只在定义该变量源文件内有效, 在同一源程序其它源文件不能使用它。...由于静态全局变量作用局限于一个源文件内,只能为该源文件内函数公用,因此可以避免在其它源文件引起错误。  ...把全局变量改变为静态变量后是改变了它作用,限制了它使用范围。          static局部变量只被初始化一次,下一次依据上一次结果值; 三、static函数与普通函数有什么区别?...static函数与普通函数作用不同,仅在本文件。只在当前源文件中使用函数应该说明为内部函数(static修饰函数),内部函数应该在当前源文件说明定义。

    70720

    C++随记(八)---存储持续性、作用链接性

    C++随记(八)---存储持续性、作用链接性 一、存储持续性 C++中一般使用3种(C++11是四种,但是书上貌似没给第四种)不同方案存储数据,这些方案区别在于数据保留在内存时间。...C++中有3存储持续性为静态变量。静态无链接性、静态内部链接性、静态外部链接性。 ③动态存储持续性: 用new运算符分配内存将一直存在,直到使用delete运算符将其释放或者程序结束为止。...这种内存存储持续性为动态,有时候被称为自由存储或者堆。 二、作用 作用描述了名称在文件(翻译单元)多大范围内可见。 作用有多种: 作用为局部变量只在定义它代码块可用。...总结:不同C++存储方式是通过存储持续性、作用、链接性来描述。 ①自动存储持续性: 在默认情况下,函数声明函数参数 变量 为 自动存储持续性, 作用为局部,无链接性。...B、内部链接性 静态持续变量 使用 将static限定符用于作用为整个文件变量时,改变量链接性将为内部。在多文件程序,内部链接性外部链接性之间差别很有意义。

    1K00

    Python什么时候会被取代?

    此外,比较PythonC++代码,不难发现Python有多么易于理解。尽管C++在设计时考虑到了英语,但与Python代码相比,阅读C++代码还是相当坎坷。...动态作用问题在于,每个表达式都需要在所有上下文中进行测试,这很繁琐。这就是为什么大多数现代编程语言都使用静态作用。 Python曾尝试过渡到静态作用,但搞砸了。...通常,内部作用(例如函数函数)能够查看更改外部作用。在Python,内部作用只能看到外部作用,但不能更改。因此引发了很多混乱。...另一方面,变量声明语句始终是语句,这意味着它们不能使用Lambda。 在Python,表达式语句之间区别相当随意,这是其他编程语言都没有的问题。...空白 在Python,你需要使用空白缩进来表示不同级别的代码。这种格式具有视觉吸引力,而且易于理解。 其他编程语言(例如C++)都需要依赖大括号分号。

    60500

    彻底理解JavaScript作用

    什么是作用?   几乎所有编程语言就是在变量存储值,并且能读取修改值。事实上,在变量存储值取出值能力,给程序赋予了状态。...动态作用   在 JavaScript 很多同学对 this 指向时而清楚时而模糊,其实结合作用会对 this 有一个清晰理解。...这个也就是专业术语:词法作用。 通俗讲变量作用是在定义时决定而不是执行时决定,也就是说词法作用取决于源码,通过静态分析就能确定,因此词法作用也叫做静态作用。...相反,只能在执行阶段才能决定变量作用,那就是动态作用。 看看下面的代码是遵循了动态作用还是静态作用呢?...从这个示例可以看出 JavaScript 默认采用词法(静态作用,如果要开启动态作用请借助 bind、with、eval 等。

    41310

    --02:名字、作用和约束(Bindings)

    那么下一步就是讨论名字和约束之间相关概念,在讨论之前先引入几个术语: 约束作用:为名字对象之间建立起了约束,那么这个约束起作用那块程序正文区域称为这个约束作用。...3.3动态作用 在采用动态作用语言中,名字对象间约束依赖于运行时控制流,特别是子程序调用顺序,与静态作用相比,动态作用显得更加简单:一个名字的当前约束就是在运行时期最近遇见那个、且没有因为作用退出而撤销那个约束...依据静态作用规则,引用环境依赖于可以出现名字声明程序词法嵌套关系;而动态作用规则引用环境依赖于运行时遇到各种声明顺序。...对于动态作用规则语言,这个问题特别重要了,即使是静态作用语言,这个问题也是关系重大。...这种推迟到调用时建立约束方式就是上面所说浅约束。一般动态作用语言默认是浅约束,当然动态作用深约束也是可以组合到一起,4.1小节会介绍这种组合。

    1K80

    从 JavaScript 作用说开去

    静态作用动态作用 在电脑程序设计作用(scope,或译作有效范围)是名字(name)与实体(entity)绑定(binding)保持有效那部分计算机程序。...因此,作用可以影响这些内容名字解析。 程序员常会缩进他们源代码作用,改善可读性。 作用又分为两种,静态作用动态作用静态作用又叫做词法作用,采用词法作用变量叫词法变量。...大多数现在程序设计语言都是采用静态作用规则,如C/C++、C#、Python、Java、JavaScript…… 相反,采用动态作用变量叫做动态变量。...C/C++是静态作用语言,但在宏中用到名字,也是动态作用。 二. 变量作用 1. 变量作用 变量作用是指变量在何处可以被访问到。...词法作用 JavaScript 变量都是有静态(词法)作用,因此一个程序静态结构就决定了一个变量作用,这个作用不会被函数位置改变而改变。 3.

    86030
    领券