精华内容
下载资源
问答
  • 在程序中定义一个变量时,这个变量是有作用范围的,变量的作用范围被称为它的作用域。 根据定义变量的位置,变量分为两种: 局部变量:在函数中定义的变量,包括参数,都被称为局部变量。 全局变量:在函数外面、...
  • 刚刚接触C语言或者还不怎么熟练的同志们可能会遇到一些关于变量作用域的问题。 今天我们一起来研究研究C语言中for循环里面的i的作用域问题: for(int i=0;i<5;i++) { for(int i=0;i<3;i++) printf("5\t...

    刚刚接触C语言或者还不怎么熟练的同志们可能会遇到一些关于变量作用域的问题。
    今天我们一起来研究研究C语言中for循环里面的i的作用域问题:

    for(int i=0;i<5;i++)
    	{
    		for(int i=0;i<3;i++)
    			printf("5\t");
    		printf("\n");
    	}
    

    初次看到这种写法的时候肯定会有很大的困惑,比如说第一次大循环时i是0,但等它结束,由于内层循环结束时i值为2,那是不是第二次大循环时i++就等于3了呢,然后内层循环就无法进入,这样想合情合理,因为前面说到变量值一旦被修改后就会覆盖原来的值,但在for循环里面的i就不一样了(仅限与在for内部定义,在外部定义就不满足)。
    下面看看运行结果:

    5 5 5 
    5 5 5 
    5 5 5 
    5 5 5 
    5 5 5 
    

    再来看一个例子:

    	int ar[5]={1,2,3,4,5};
    	for(int i=0;i<4;i++)
    	{
    		printf("\n");
    	}
    	printf("%d",ar[i]);
    

    目的是输出输出数组得第个元素值,然而会发现报错:
    在这里插入图片描述
    因为i是在for循环内部申明的,它的作用域仅限于循环内部。
    稍作修改:

    	int ar[5]={1,2,3,4,5};
    	int i;
    	for(i=0;i<4;i++)
    	{
    		printf("\n");
    	}
    	printf("%d",ar[i]);
    

    输出:

    5
    
    展开全文
  • python变量作用域

    2021-01-29 15:24:09
    在程序中定于一个变量时,这个变量时有作用范围的,变量的作用范围被称为它的作用域,根据定义变量的位置,变量分为两种:局部变量:在函数中定义的变量,包括参数,都被称为局部变量。全局变量:在函数外面,全局...

    在程序中定于一个变量时,这个变量时有作用范围的,变量的作用范围被称为它的作用域,根据定义变量的位置,变量分为两种:

    局部变量:在函数中定义的变量,包括参数,都被称为局部变量。

    全局变量:在函数外面,全局范围内定义的变量,被称为全局变量。

    每个函数在执行时,系统都会为该函数分配一块‘临时内存空间’,所有的局部变量都被保存在这块临时内存空间内。但函数执行完成后,这块内存空间就被释放了,这些局部变量也就消失了。

    全局变量意味着他们可以在所有函数内被访问。

    不管实在函数的局部范围还是全局范围内,都存在多个变量,每个变量持有该变量的值,这些变量和他们的值就想一个看不见的字典,其中变量名字就是key,变量值就是value。

    实际上python提供了如下三个工具函数来获取指定范围内的‘变量词典’

    globals():该函数返回全局范围内所有变量组成的‘变量字典’

    local():该函数返回当前局部范围内所有变量组成的‘变量字典’

    vars(object):获取在只能法定对象范围内所有变量组成的‘变量字典’,如果不传入object参数,vars()和locals()的作用完全相同。

    locals()总是获取当前局部范围内所有变量组成的‘变量字典’,因此,如果在全局范围内调用locals()函数,同样获取全局范围内所有变量组成的‘变量字典’,globals()无论在哪执行总是获取全局范围内所有变量组成的‘变量字典’

    >>> def test():

    age=20

    print(age)

    print(locals())

    print(locals()['age'])

    locals()['age']=12

    print('现在的age:',age)

    globals()['x']=55

    >>> test()

    20

    {'age': 20}

    20

    现在的age: 20

    >>> x

    55

    >>> x=5

    >>> x

    5

    >>> test()

    20

    {'age': 20}

    20

    现在的age: 20

    >>> x

    55

    全局变量默认可以在所有函数内被访问,但是如果在函数中定义了与全局变量同名的变量,此时就会发生局部变量遮蔽(hide)全局变量的情形。

    >>> name='charlie'

    >>> def test():

    print(name)

    >>> test()

    charlie

    >>> print(name)

    charlie

    >>> def test():

    print(name)

    name='bob'#在这里再定义一个name,name后面会出错

    >>> test()

    Traceback (most recent call last):

    File "", line 1, in

    test()

    File "", line 2, in test

    print(name)

    UnboundLocalError: local variable 'name' referenced before assignment #在未被定义就被提及

    >>> print(name)

    charlie

    该错误提示test()中的print(name)的那么还未定义。这正是程序中name='bob'导致的。

    python规定在函数内对不存在的变量赋值时,默认就是重新定义新的局部变量。因此这行代码重新定义了那么的局部变量,这样name全局变量就被遮蔽了。

    如何便面这种情况?

    >>> name='charlie'

    >>> def test():

    #通过globals()函数访问name全局变量

    print(globals()['name'])

    name='bob'

    >>> test()

    charlie

    >>> print(name)

    charlie

    >>> def test():

    #通过globals()函数访问name全局变量

    print(globals()['name'])

    name='bob'

    print(name)

    >>> test()

    charlie

    bob

    或者

    >>> name='charlie'

    >>> def test():

    global name  #全局声明,声明name是全局变量,后面的赋值语句不会重新定义局部变量

    print(name)

    name='bob'

    print(name)

    >>> test()

    charlie

    bob

    >>> name

    'bob'

    展开全文
  • Javascript变量作用域、变量提升

    千次阅读 2017-09-19 08:18:31
    Javascript变量变量提升以及作用域 执行环境对js编程的重要性不容忽视,理解其执行的原理,将有效提升编程素养。

    Javascript变量提升

    javascript数据类型存储结构
    图 1 Javascript数据类型存储结构

    Javascript 作为一种动态语言,其语法特别是变量具有更多的灵活性。

    1. 先看下一个经典的面试题,

    var a=1;
    function foo(){
      a=10;
      return;
      function a(){ }
    }
    foo();
    console.log(a);

    结果输出不是10,是1;如果你还不是清楚背后的原理,那么请继续往下看;

    2. Javascript变量

    JS的数据类型有两大类,对应两种不同的存储方式栈存储、堆存储;ECMAScript定义了7中数据类型(ES5增加Symbol) 基本类型(Undefined、Null、Symbol、Boolean、Number、String)和引用数据类型(Object),引用数据类型又包括Date、Array、Function、Math、RegExp等其他核心对象。
    由于数据类型及存储结构的不同,JS在执行的过程中其处理方式也不同;但ECMAScript函数参数的传递与其他语言不同,分为 局部变量传参按引用传参
    ①局部变量传参:基本类型数据是是 局部变量传参,不是 按值传递参数,可以理解为所有函数中传递的参数都是深拷贝到一个临时变量后,将临时变量传递到函数执行,即不会影响原始变量;如需改变原始变量,需要手动对原始变量进行重新赋值。
    ②按引用数据传参:引用数据类型传参是 引用传参,及传递数据的引用,所有在函数内部进行的对参数的操作,都会直接影响到原始变量对象。由此也可以看出引用类型数据的存在极大的节约了内存空间。

    2.1 先来看一个简单例子:局部变量传参

    function box(num){
        num+=10;
        return num;
    };
    var num=5;
    var result=box(num);
    console.log(result);//15   函数改变传入参数值,并返回给result
    console.log(num);   //5    因为不是按值传递,原始变量值未进行改变

    2.2 再来看一个例子:按引用传参

     function foo(obj){
         obj.name='new'
     };
     var p={};
     foo(p);
     console.log(p);     // {name:'new'}  引用传参,按指针影响原始变量
     console.log(p.name);// new

    3. 作用域 Scoping、执行环境Context

    3.1 变量作用域:字面理解即变量的作用范围,亦即变量可被访问到的空间。
    ①.JS只有两种作用域:全局作用域、函数作用域;
    ②.ES6新增加了块级作用域的概念,及仅由 let关键字声明的变量、其作用范围为 {}代码块。
    3.2 执行环境:与作用域相对应,及函数/代码运行时,可访问的变量空间。
    ①.每个函数执行时,都会创建自己的执行环境;当执行到该函数时,函数所属的执行环境会被推入到环境堆栈中去执行;函数执行结束后,将从环境堆栈中弹出销毁,将控制权交给上一级执行环境;
    ②.代码在环境中执行时,会同时生成作用域链,其作用是用于保证函数执行时具有访问权的变量、函数 按需依次向上级进行有序的访问;作用域链的前端,即执行环境的变量对象。
    eg:
    var global='global context';
    var inner='global inner context';
    function foo(){
      console.log(global); //foo函数内部无global变量,向上级查找global变量
      console.log(inner);  //foo函数内部有inner变量,无需向上查找inner变量,但此时
      var inner='inner context';
      console.log(inner);  
    }
    foo();// global context
          // undefined
          // inner context

    4. 变量提升 Hoisting

    JS中变量进入一个作用域有以下四种方式:

    • 变量声明:如:var a;var fn=function(){};
    • 函数声明:如:function foo(){};
    • 函数形参:函数的形参存在于函数作用域中;
    • 语言自定义构建:所有的作用域都会自动生成thisarguments两个默认变量

    JS在执行前会预先创建好执行环境变量,但由于其弱类型语言特征,其变量和函数可同时定义并赋值,为保证执行环境的完整性,及函数执行的有效性,JS会在编译阶段将所有变量、函数的声明事先放入内存,以保证其可访问性。从代码结构来看,好像是把所有变量的声明、函数的声明都放在代码头部事先执行一样;

    再回过头来看看本篇开始的程序就不难理解了,其执行顺序与下面的代码完全一致;
    1.将外部函数foo声明提前,foo函数定义提升到代码开始之前;
    2.将 内部函数a提升到foo函数作用域顶部,此时输出:function(){};
    3.将a类型由函数类型重新定义为number类型,并赋值10;
    4.将内部函数执行环境从执行堆栈中弹出销毁;此时外部a值未做改变,仍为1;
    5.输出外部变量a,其值必然为 1;
    var foo;
    var a=1;
    function foo(){
      var a=function(){}; 
      a=10;
      return;
    }
    foo();
    console.log(a);//1

    5. 动态语言 VS 静态语言

    Javascript作为一门动态语言,与静态语言的差别在于变量的和数据类型的维护,亦即底层的存储结构及实现不同。那么具体有什么差异?

    5.1 静态语言:亦称‘强类型语言’,比如JAVA有一下特点:
    ①变量使用前必须提前声明;②变量使用前必须声明类型;③变量一旦定义,只能改变其值,不能改变其类型;
    5.2 动态语言:亦称‘弱类型语言’,比如我们今天讨论的JAvascript,同样有一下三个特点:
    ①变量 使用前不必提前声明;②变量类型使用前也不必提前声明;③变量声明赋值后,可以在任何地方按需要随时改变其类型和值;
    展开全文
  • #include int main(void){ ... }//i的作用域不止在for循环里 std::cout ; //在main函数的这部分依旧可以访问i return 0; } /**i的作用域: 从for语句中定义开始到for语句结束括号的下一个括号 */
    #include <iostream>
    int main(void){
    	for(int i = 0;i < 10;i++){
    	}//i的作用域不止在for循环里
    	std::cout << i << std::endl;
    	//在main函数的这部分依旧可以访问i
    	return 0;
    }
    /**i的作用域:
    从for语句中定义开始到for语句结束括号的下一个括号
    */

    展开全文
  • 平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量作用域的兴趣。 大家都知道c#中的局部变量,在if中如果...
  • 作用域分为三种:全局作用域(全局变量),局部作用域(局部变量),块级作用域(es6新增) 什么是全局变量(在函数外定义的变量) 什么是局部变量(在函数内定义的变量) 为什么刚学习js的时候都说要少用全局...
  • C++中的临时变量

    千次阅读 2016-08-12 16:52:21
    文章详细介绍了临时变量在编译器处理视角中是怎样生存、消亡的,同时涉及其对引用、指针的一些影响,略微深奥,但很清晰。 未能考证,据文章介绍知识点来自 >。 ) 它们是被神所遗弃的孩子,没有人见过它们...
  • 【c++】变量作用域和生存周期

    千次阅读 多人点赞 2018-05-03 22:10:30
    【c++】变量作用域和生存周期一.作用域和生存周期二.局部变量和全局变量三.变量的存储类别四.分别介绍以上四种存储类型(auto/static/register/extern)五.四种变量作用域、生命周期、内存分布(全局、静态...
  • 1、变量作用域和生命周期; 2、函数的作用域和生命周期; C++程序执行时,内存块的划分。 1、栈区:编译器自动分配内存,回收内存。存放函数参数值,局部变量值。操作方式类似于数据结构中的栈。它不是数据...
  • JS关于for循环中变量作用域的问题

    千次阅读 2018-09-20 15:30:41
    js中作用域只有函数作用域和全局作用域,在函数体内使用var 定义的变量,会被提到函数开始处进行定义,作用域为整个函数,常见的误区如下 1 var a=[]; 2 for(var i = 0;i&lt;10;i++){ 3 var q = i; 4 a...
  • shell循环中变量作用域问题

    千次阅读 2017-07-24 11:12:20
    按照常理shell中的变量默认是全局变量,不会存在变量作用域的问题,于是上网查了下,发现问题出在while上 while循环读取文件中内容有两种写法,一种是管道符,一种是重定向,写法如下 管道符: cat $file_...
  • 1. 作用域 Python的作用域可以分为四种: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-in) 内建作用域 变量/函数 的查找顺序: L –> E –> G –>B ...
  • 1.表变量拥有特定作用域(在当前批处理语句中,但不在任何当前批处理语句调用的存储过程和函数中),表变量在批处理结束后自动被清除。 2.表变量临时表产生更少的存储过程重编译。 3.针对表变量的事务仅仅在更新
  • 作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。 static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到...
  • 在C/C++中大括号指明了变量作用域,在大括号内声明的局部变量作用域变量声明始,到大括号之后终结。我们应该善用它,使我们的程序更加清晰明白。尤其是在有许多形式重复的代码的程序段中,以下是一个伪代码...
  • let 声明 let 声明是 ES6 中很常见的特性,它的工作方式类似于var...提升是将变量或函数定义移动到作用域头部的过程,通常是 var 声明的变量和函数声明function fun() {...}。 ES6 新增了let命令,用来声明变量。它...
  • 作用域作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域作用域的使用提高了程序逻辑的局部性,增强程序的...
  • Gradle脚本的变量及其作用域

    万次阅读 2016-04-25 07:35:24
    gradle脚本中的project和this gradle脚本中的变量作用域
  • 对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以...
  • 全局变量 也称外部变量,在函数体外定义。 全局变量分为外部全局变量和静态全局变量。区别:使用static存储类别的全局变量只能在被定义的源程序文件中使用,而使用extern存储类别的全局变量不仅可以在被定义的源程序...
  • // 关于临时变量出其作用域就释放的例子 #include // 临时变量s出函数作用域就销毁了,该空间里就是随机值 unsigned short *sum(unsigned char a, unsigned char b) { unsigned short s = 0; s = a + b; ...
  • 变量(定义 初始化)、临时变量

    千次阅读 2020-05-21 09:45:42
    声明外部变量)告诉编译器变量名字与类型; 变量的定义:为变量分配存储空间,此时也可以给定初始值; 函数的声明:告诉编译器有这么一个函数; 函数的定义:实现函数,简言之就是带有{ }; 与结构体一样,类...
  • Javascript作用域变量提升

    万次阅读 多人点赞 2013-06-05 22:43:30
    输出结果是1 2 1,这是因为C家族的语言有块作用域,当程序控制走进一个块,比如if块,只作用于该块的变量可以被声明,而不会影响块外面的作用域。但是在Javascript里面,这样不行。看看下面的代码: var x = 1; ...
  • 代码引用变量时总会最优先查找当前代码块中(不包含任何子代码块)的那个变量  2.如果当前代码块中没有声明以此为名的变量,那么程序会沿着代码块的嵌套关系,一层一层的查找  3.一般情况下,程序会一直查到...
  • perl变量作用域以及定义方式。

    千次阅读 2013-03-15 17:09:07
    perl也有作用域的概念,perl定义的变量默认是全局的,当在定义变量时使用 my $abc,那么$abc的作用域就限定在当前函数体或当前for循环中。 乃局部变量。 答(二): our,"把名字限于某个范围“,其实就是明确声明...
  • 一 C语言中的变量存储类别: 1 auto(自动) 2 register(寄存器) ...不同的分配方式下,变量的生存期,作用域和可见域各不相同。 二 作用域区分: 变量可分为局部变量和全局变量。 局部变量: 在函数内部定义...
  • 在VimScript中默认的作用域是全局作用域,也就是说你在一个脚本文件中定义了一个变量,在其他脚本中也可以读取和修改这个变量。在任何编程语言中,全局变量的滥用都会造成混乱,所以VimScript提供了更多的非全局作用...
  • 首先要理解生存周期与作用域的区别:生存...作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量
  • perl变量作用域--local,my,our

    千次阅读 2013-01-17 15:18:36
    变量作用域  (一)包变量  $x = 1  这里,$x是个包变量。关于包变量,有2件重要的事情要了解:  1)假如没有其他申明,变量就是包变量;  2)包变量总是全局的。  全局意味着包变量在每个程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,997
精华内容 33,998
关键字:

临时变量的作用域