精华内容
下载资源
问答
  • 那么定义在函数体内的局部变量在栈分配空间时为什么不同时也给它初始化为0呢?为什么C++要允许未定义的值存在呢? 把没有特别指定初始值的全局空间初始化为0不需要程序本身付出任何直接成...

    为什么“定义在函数体内部的内置类型变量将不被初始化”,而“定义于任何函数体之外的变量被初始化为0“?

    问题中的两句话来自《C++ Primer》。定义在函数体之外的变量即全局变量放在全局区存储,并初始化为0。那么定义在函数体内的局部变量在栈中分配空间时为什么不同时也给它初始化为0呢?为什么C++要允许未定义的值存在呢?

     

    把没有特别指定初始值的全局空间初始化为0不需要程序本身付出任何直接成本。程序不需要额外的数据记录这些0,也不需要额外的代码去设置这些0,这活操作系统直接就能替你干了。而初始化成0,实际上就是抹去内存中原来的数据,这很政治正确。

    对于局部变量,初始化必须通过函数内代码实现,不论空间还是时间都有成本,而且是每次调用都有的时间成本。而栈中的数据本来也都是应用自己的数据,不存在抹不抹的问题。

    发布于 2017-04-29

    全局变量分2种,一是有初始值,二是没有初始值。

    int i=0;
    int j;
    int k=1;
    int m;
    感兴趣的可以打印下以上全局变量的地址。i,j并不是连续存放,i,k连续存放j,m连续存放。
    编译之后,有初始化数据的变量放到data段,初始值就放在可执行程序里。程序加载的时候,除了加载代码段,还要加载data段。这样的变量越大越多,可执行程序就越大。
    而没有初始化数据的全局变量放在另外的段,一般叫bss段。这个区域不占用可执行程序的空间。即你无论申明多大的未初始化变量,可执行程序也不会变大。加载程序时候,只需要分配相应大小的内存。分配内存之后可以初始化为0,也可以初始化为0xcccccccc,也有可能不初始化,看操作系统跟加载程序以及内存分配算法(有的内存分配的时候也会初始化为0)。因此你说的全局变量初始化为0是不正确的。有的系统是,有的系统不是。
    有初始化数据的data段是加载程序的时候初始化的,程序运行之后不会再次初始化。如果你在程序执行过程中,跳到入口那里重新执行,那么这些变量不会再次初始化。
    还有一种变量初始化是靠指令的。比如申明全局变量,然后在main函数初始化。
    另外就是栈变量,栈变量初始化也是用指令的。比如int i=123;那么编译成汇编可以看到有对栈变量赋值123的指令。因此只要函数每次被调用,都会重新初始化。

    发布于 2017-05-03

    渣渣程序员

    C++需要自己操心的太多,标准中是这么规定的,“定义于任何函数体之外的变量被初始化为0“这句话已经有人给你解释了,全局变量清内存再用,“定义在函数体内部的内置类型变量将不被初始化”这句话你如果想自己调试看,不同的编译器有不同的结果,程序定义变量的方式就是在内存中选一段大小为 sizeof xx 的内存,局部变量的值取决于这块内存,有点编译器会初始化成0,这根标准无关。

     

    c语言中,若在函数内部定义变量时没有给变量赋予初值,如int a;,则a的初始值为局部变量未初始化就是一个随机值,如果声明的int为全局变量会默认初始化为0

     

    变量的定义实际是指定了一个内存的单元而已,如果刚开机也许是0
    大多不确定,是个随机数

    而其他的语言大多是0,

    这就是C 的特别之处,一般都要预先赋初值,语言省事了,编程的人麻烦一点点

    展开全文
  • 1,作用域:变量起作用范围称为变量作用域,不同作用域内同名变量之间互不影响。 变量分为:全局变量、局部变量。 2,全局变量 ...1)在函数体中(包含形式参数)声明变量。 2) 局部变量的...

    1,作用域:变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。
    变量分为:全局变量、局部变量。

    2,全局变量
    1) 在函数和类定义之外声明的变量
    2)全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
    3) 全局变量一般做常量使用。
    4)函数内要改变全局变量的值,使用 global 声明一下

    3,局部变量:
    1)在函数体中(包含形式参数)声明的变量。
    2) 局部变量的引用比全局变量快,优先考虑使用。
    3)如果局部变量和全局变量同名,则在函数内会隐藏全局变量,只使用同名的局部变量

    用例子来说明:
    例1
    a=0 # 全局变量
    def hanshu():
    a=2 # 局部变量
    print(a) #2
    hanshu()
    print(a) #0

    例2
    #如果全局同名变量是可变的数据类型,函数可以对全局变量内部直接进行修改

    a=[]
    def hs():
        # a=[]
        a.append(1)
        print(a)
    hs()
    print(a)
    

    输出:
    [1]
    [1]
    当有同名局部变量(a=[])时,则输出为
    [1]
    []
    所以函数优先读取局部变量
    例3

    a=[]
    def hanshu():
        a=8
        print(a)
    print(a)
    hanshu()    #二者交换有不同结果?不
    

    例4

    a=3
    def hanshu():
        a+=5   #a=a+5  把a+5赋值给a a+5中的a找不到 #输出报错,找不到局部变量a,无法加
    hanshu()
    print(a)
    

    输出:报错
    区别以下:

    a=3
    def hanshu(a):
        a+=5
        print(a)
    hanshu(2)
    print(a)  
    

    输出:
    7
    3

    4,重点: LEGB
    #变量的查找顺序 从里向外查找
    #作用域局部>外层作用域>当前模块中的全局>python内置作用域;
    #local>enclose>global>built-in LEGB
    例如:

    a=1
    b=1
    c=2
    def waibu():
        b=20
        c=30
        def neibu():
            c=300
            print(c) #local
            print(b) #enclose
            print(a) #globar
            print(max) #built-in
        neibu()
    waibu()
    

    输出:
    300
    20
    1
    built-in function max

    展开全文
  • 60.函数作用域(全局变量和局部变量) 变量起作用范围称为变量作用域,不同作用域内同名变量之间互不影响。 变量分为:全局变量、...在函数体中(包含形式参数)声明变量。 局部变量的引用比全局变量快,优先考

    60.函数的作用域(全局变量和局部变量)

    变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。

    变量分为:全局变量局部变量

    没有必要情况一般使用局部变量性能高

    全局变量:

    1. 函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。
    2. 全局变量降低了函数的通用性可读性。应尽量避免全局变量的使用。
    3. 全局变量一般做常量使用
    4. 函数内改变全局变量的值,使用global声明一下

    局部变量:

    1. 函数体中(包含形式参数)声明的变量。
    2. 局部变量的引用比全局变量优先考虑使用
    3. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名局部变量

    【操作】全局变量的作用域测试

    a = 100 #全局变量 
    def f1():
        global a #如果要在函数内改变全局变量的值,增加 global关键字声明 
        # 如果不加这一句的话 下面  print(a) 将会报错。
        # UnboundLocalError: local variable 'a' referenced before assignment
        print(a) #打印全局变量a 的值
        a = 300
        # 就算放 print(a) 到这里
        # 打印的 是 300  
        # 但是 你在 函数外面 访问 a 的时候  依然 还是 100
    f1() 
    print(a) # 这一句是在 外面 打印 a  但是 却是 300 说明修改成功
    

    执行结果:

    100 
    300 
    

    【操作】全局变量和局部变量同名测试

    a=100 
    def f1(): 
        a = 3 # 同名的局部变量 
        print(a)
        
    f1() 
    print(a) # a 仍然是100,没有变化
    

    执行结果:

    3 
    100
    

    【操作】 输出局部变量和全局变量

    a = 100
    def f1(a,b,c):
        print("a b c : ",a,b,c) 
        print("局部 : ",locals()) #打印输出的局部变量 
        print("全局 : ",globals()) #打印输出的全局变量
        
    f1(2,3,4)
    
    
    # 运行效果
    
    In [1]: a = 100
       ...: def f1(a,b,c):
       ...:     print("a b c : ",a,b,c)
       ...:     print("局部 : ",locals()) #打印输出的局部变量
       ...:     print("全局 : ",globals()) #打印输出的全局变量
       ...:
       ...: f1(2,3,4)
    a b c :  2 3 4
    局部 :  {'c': 4, 'b': 3, 'a': 2}
    全局 :  {'__name__': '__main__', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None, '__loader__': None, '__spec__': None, '__builtin__': <module 'builtins' (built-in)>, '__builtins__': <module 'builtins' (built-in)>, '_ih': ['', 'a = 100\ndef f1(a,b,c):\n    print("a b c : ",a,b,c) \n    print("局部 : ",locals()) #打印输出的局部变量 \n    print("全局 : ",globals()) #打印输出的全局变量\n    \nf1(2,3,4)'], '_oh': {}, '_dh': ['D:\\'], 'In': ['', 'a = 100\ndef f1(a,b,c):\n    print("a b c : ",a,b,c) \n    print("局部 : ",locals()) #打印输出的局部变量 \n    print("全局 : ",globals()) #打印输出的全局变量\n    \nf1(2,3,4)'], 'Out': {}, 'get_ipython': <bound method InteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x04C01510>>, 'exit': <IPython.core.autocall.ExitAutocall object at 0x04C01C50>, 'quit': <IPython.core.autocall.ExitAutocall object at 0x04C01C50>, '_': '', '__': '', '___': '', '_i': '', '_ii': '', '_iii': '', '_i1': 'a = 100\ndef f1(a,b,c):\n    print("a b c : ",a,b,c) \n    print("局部 : ",locals()) #打印输出的局部变量 \n    print("全局 : ",globals()) #打印输出的全局 变量\n    \nf1(2,3,4)', 'a': 100, 'f1': <function f1 at 0x042142B8>}
    

    代码说明

    
    a = 3  # 这就是一个全局变量
    
    
    def test04():
        b = 4       # 局部变量
        print(b * 10)
    
        # global a  # 如果要在函数内改变全局变量的值,增加 global关键字,声明
        a = 300
        print(a)
    
    
    test04()
    print(a)
    # 每次调用函数的时候,python会调用 一个 栈帧   strake frame
    # 用完就丢掉了  b在 strake frame  栈帧里面
    

    局部变量和全局变量效率测试

    局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。 在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运 行速度。

    代码如下:

    import math
    from timeit import timeit
    # 代码段 1 全局变量
    test_global_code="""
    def test05():
    	for k in range(10000000):
    		math.sqrt(30)
    """
    # 代码段 2 局部变量 math 赋给 b 
    test_local_code="""
    def test06():
    	b=math.sqrt
    	for k in range(10000000):
    		b(3)
    """
    # 用 timeit 来调用 number 是执行次数  
    # 乘以 1000 是因为 换算为 毫秒 ms 数值看起来大一点。
    timeit(test_global_code,number=10)*1000 # 全局  timeit 返回的是一个 浮点数
    timeit(test_local_code,number=10)*1000 # 局部
    
    
    
    In [4]: test_global_code="""
       ...: def test05():
       ...:     for k in range(10000000):
       ...:         math.sqrt(30)
       ...: """
    
    In [5]: test_local_code="""
       ...: def test06():
       ...:     b=math.sqrt
       ...:     for k in range(10000000):
       ...:         b(3)
       ...: """
       
    In [23]: timeit(test_local_code,number=1000000)*1000 # 局部
    Out[23]: 66.5988000000084
    
    In [24]: timeit(test_global_code,number=1000000)*1000 # 全局。 
    Out[24]: 67.5967999999898
    # 大家不要看  这里 只是提升了 一毫秒
    # 因为 math 导入进来之后本来就挺快的
    # 因为如果是你自己写的 变量。 那速度提升就很可观了。
    
    

    关于一个生成默认参数的函数

    def test():
        for i in range(3):
            def a():
                f=i
                # 这里的i 本来是无法保存的
                return f
            arr.append(partial(a,i)) # 用这个偏函数保存到 默认参数中去了。
            # 因为函数 a 没有 调用 所以 无法开辟空间  也就无法 维护 每一个 i 的值。记录i 的值。
    

    在这里插入图片描述

    看一个js 的例子

    js es6 是有 let 这样的声明关键字的。 然后他声明的 是块级作用域 。

    下面例子 i 只能在 {} 中生效,每循环一次 就会 开辟一块 空间 。 这个内存空间 就是作用域。

    和我们python 中 函数的局部作用 差不多。 每次调用函数 都有临时 开辟一块 空间。 之后再 垃圾回收。

    let arr=[]
    for(let i=0;i<3;i++){
        arr.push(function(){
            return i
        })
    }
    
    
    

    在这里插入图片描述

    展开全文
  • 保险动车车辆辆保损失,部变变量保险人保任险责属于是(。保险赔要是车辆偿方机动式主。被保舶如部损内发长的在延险船时间生全失,保远舶保洋船期保情况按定险投险下,保险)需加付(费。保险本险...

    中作用函不可的气灭火于扑体火灾切断气源二氧救灭系统化碳火前可用。

    局据保险本险不包的基车辆机动括(。

    保险动车车辆在机中险的辆保损失,部变变量保险人保任的险责属于是(。保险的赔要是车辆偿方机动式主。被保舶如部损内发长的在延险船时间生全失,保远舶保洋船期保情况按定险投险的下,保险)的需加付(费。保险本险包括的基车辆机动。

    284932.jpg

    农业在野外进行生产,量的临进保险标的农业点多对分面广因此、量的临进相散,般财的保的那样有产保其数险中险标限量亦非一,映农业保特点为(即反险的,般保比的保场所址范围可险中险地非一生产。的适免赔用范围包额(括(率),保险远洋船舶中。

    为时保数中保险定有车辆常规中通机动。存数储复溜是。需要行存不属保险动车的是于机责任抢险下列险盗辆保。定义保险大的目前模最业务财产中保我国险种费规是(。中作用函不属的是于农业保特点下列险的。

    保险当承担的赔偿责任人应是(,局据保了第三某人有车车辆者责任险将自险和辆投损失,局据由于雨视清下暴线不,医疗车上车辆造成载货物和人员费用、所损失。吊顶的耐应低于0限不火极,部变变量没灭采用统的全淹区二氧化碳火系防护,的耐应低于1、窗区的围护结构及门限不火极防护。

    量的临进不是哪项毒有以下中天然有害成分食品。

    为时保数中倍数泡沫沫灭沫液液采用统可中倍中倍火系或高数泡数泡。

    存数储舶保包括的船障范围不狭义险保。

    需要行存保险的保远洋船舶任的下列险责属于是(。保险不包远洋一切船舶责任险的括(范围。尿期饮食治疗急性竭多肾衰。量的临进不是哪项毒有以下中天然有害成分食品。

    展开全文
  • static限制作用域,作用域为本文件内有效(定义变量的源文件内), 同一源程序其它源文件不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免其它源文件...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量区别在于全局变量对所有函数都是可见,而静态局部变量只对定义自己的函数体始终可见。...
  • 全局变量和局部变量 1.什么是全局变量和局部变量 1) 全局变量 定义在函数和累外面变量就是全局变量 作用域:从定义开始到文件结束任意位置都可以使用 ...只能在函数体中使用; 功能: 在函数中定义
  • 函数 函数概念: 函数就是实现某一特定功能代码封装。 函数分类 ...​ 函数体 位置参数和关键字参数 位置参数 ----调用函数时候直接括号里面写多个实参,实参和形参是一一对应 关键字参数---
  • @TOC 变量作用域(全局变量和局部变量) 变量起作用范围称为变量作用域,不同作用域内同名变量之间互不影响...1.在函数体中(包含形式参数)声明变量。 2.局部变量的引用比全局变量快,优先考虑使用。 3.如果局部
  • 在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量值进行保存。通常想法...
  • 使用Python写代码时候,经常会定义许多函数,因而也会定义许多变量,但是由于我们经常使用变量名很有限,所以往往会出现“重名”现象,这时候就需要我们有一双“火眼金睛”来识别哪些变量属于局部变量,哪些...
  • 函数中的变量

    2019-02-19 18:40:01
    函数的变量 本文为大家说明函数的变量,其分为两部分,全局变量和局部变量。...这里我说明一下,定义的变量只能在函数所包含,只能在函数体内部才能识别进行使用这就是局部变量; 那么什么是动态呢,动...
  •  局部变量,只在定义方法有效 二、方法的定义(一个类可以有多个方法) .  什么是局部,方法内部,块内部都是局部,执行指令退出那个局部,局部变量自动清除  成员变量:作为类成员而存在,直接...
  • 成员变量:方法、构造函数或者语句块中定义的变量被称为局部变量。 特点:变量的声明和初始化都是方法中,方法结束后,变量就会自动销毁。 例:下面代码块的s2 成员变量:成员变量是定义类中,方法之外的...
  • 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量区别在于全局变量对所有函数都是可见,而静态局部变量只对定义自己的函数体始终可见。...
  • 2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量区别在于全局变量对所有函数都是可见,而静态局部变量只对定义自己的函数体始终可见。...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量区别在于全局变量对所有函数都是可见,而静态局部变量只对定义自己的函数体始终可见。...
  • - 程序结束释放在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有...
  • 局部变量:在一个函数体中出现的变量在函数体外不能调用,在一个循环体的圆括号内定义的变量,在循环体外不能调用。与之类似的还有一些,不过剩余的基本可以这么说,在符合规范的代码中,花括号和main()函数花括号...
  • 第7章 函数 函数是重要程序段。它们允许你给一块语句一个名称,然后你可以程序任何地方使用这个名称任意多次地运行这个语句块。...接下来是一块语句,它们是函数体。 # -*- coding:utf-8 –*- ...
  • 局部变量:形参和函数体内部定义的变量。 局部静态变量:将局部变量定义为static类型。 三者区别 1.形参是一种自动对象,是由传递函数的实参进行初始化,作用域仅仅是所在函数体内有用,,函数终止,则形参也被...
  • 在函数体内部定义的变量,是局部变量,所处的是内部作用域(内部定义空间) 在函数体外部定义的变量,是全局变量,所处的是外部作用域(外部命名空间) 函数体内一个变量的查找顺序(局部变量的查找顺序) 1.当前函数内部...
  • 全局变量可以直接在函数体内容部使用,你可以直接访问,但是注意是,如果对于不可变类型数据,如果在函数里面进行了赋值操作,则对外面全局变量不产生影响,因为相当于新建了一个局部变量,只是名字和全局...
  • C语言的局部变量和外部变量

    千次阅读 2015-08-14 06:03:04
    在函数体或复合语句声明的变量为局部变量。函数的形式变量也是局部变量。在所有函数体外定义的变量称为外部变量(或全局变量)。
  • 从作用域看: ...它只被初始化一次,自从第一次初始化直到程序结束都一直存在,他和全局变量区别在于全局变量对所有函数都是可见,而静态局部变量只对定义自己的函数体始终可见。 局部变量也只有局
  • 全局变量:其是所有的函数体的外部定义的,程序的所有部分(甚至是其他文件的代码都可以使用,存储程序部分的静态存储区,也就是作用域为整个程序的结束),但是如果另外一个文件使用extern关键字声明另外一...
  •  (1)在函数体内部或者复合语句中定义的变量称为局部变量。  (2)作用域为当前的函数体。  (3)在栈区(动态存储区)分配。  (4)函数调用时开始分配,调用结束时释放。 2.全局变量:  (1)在函数体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 730
精华内容 292
关键字:

在函数体中定义的局部变量