精华内容
下载资源
问答
  • 全局变量有时也需要初始化,而局部变量其实大部分时间都没有初始化。不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/...

    满意答案

    02ae427d08e371d7e90d5b995e828d6d.png

    ccc000267

    推荐于 2017.11.23

    02ae427d08e371d7e90d5b995e828d6d.png

    采纳率:52%    等级:8

    已帮助:712人

    这个说法本身就不对。变量需要不需要初始化是根据需要来进行的。全局变量有时也需要初始化,而局部变量其实大部分时间都没有初始化。不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/C++代码实现的,程序开始执行后才给变量赋的值。只是全局变量如果不显式初始化,那么编译时由编译器自动初始化为0,而编译器对局部变量是否有值视而不见,所以在程序开始执行前局部变量的“值”是机器垃圾。因此,局部变量在获得初值前若当右值使用就要出问题!局部变量获得初值有两个途径:一是初始化,如int x=3;就是在声明x的类型时同时初始化为3——x==3这个值在编译时就被编译器确定了,程序启动后不再执行int x=3;这种操作;二是赋初值,如int x;x=3;,int x;在编译时执行,只声明了变量类型,值是垃圾,x=3;是C/C++语句,每次启动程序都要执行,将变量x赋值为3。所以,说“局部变量其实大部分时间都没有初始化”,就是指我们创建函数时往往只写int a,b,c,x,y,z;而并不给每个变量都初始化一个确定的值,而是在使用前给它们赋初值,如紧接着写scanf("%d%d%d",&a,&b,&c);或for(x=0;x<10;x++){...}(其中x=0是给x赋初值)等。

    40分享举报

    展开全文
  • 我有一个初始化一些全局变量的Python模块;这样的事情:#!/usr/bin/env pythonimport re"""My awesome python library."""# A word list from the standard UNIX dictionary.with open('/usr/share/dict/words', 'rt'...

    我有一个初始化一些全局变量的

    Python模块;这样的事情:

    #!/usr/bin/env python

    import re

    """My awesome python library."""

    # A word list from the standard UNIX dictionary.

    with open('/usr/share/dict/words', 'rt') as f:

    WORDS_LIST = f.read().split('\n') + ['http'] + ['fubob']

    # Some compiled regular expressions.

    COMPILED_REG1 = re.compile("a")

    COMPILED_REG2 = re.compile("b")

    # Some constants.

    A = 10

    B = 20

    def say_hello(): print('hello')

    def do_something(): return 'something'

    当然它可以工作,但我觉得这不是正确的方法:每次我导入这个模块时,Python都会执行它.在此示例中,它将读取文件并编译正则表达式.

    我读到有些人创建了一个config.py文件并用它做了一些事情,但我不确切知道它是如何工作的.

    所以,我想知道如果你必须制作一个标准的Python库,你将如何处理这个问题.

    展开全文
  • 前几天,有个大佬考了我一个问题:什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白...

    前几天,有个大佬考了我一个问题:为什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?

    说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白一点了。

    首先我给出一个具体的场景来说明这个事情:

    9856d2e414f716d250cf0da48046b165.png

    定义一个Cat类,里面有各种属性,包括8大基本数据类型和String类型,我们把String类视为复杂数据类型。Cat类里面有一个setAge方法。我们在main方法里面给tom这个Cat赋值年龄,结果发现,如果给定的年龄没有赋初始值,编译器会报错:

    3d5fc092b602c7eea5d86ae0eb736ea1.png

    那我们来看下未给Cat里面的各种属性初始化,各项属性的初始值究竟是怎样的:

    重写一下toString方法:

    acebcf7c806ff2c5cb442bfce0b51035.png

    然后输出结果为:

    28c700eb2f4692f9d4f158502dc635c6.png

    我们能够看到,对于8大基本类型的初始化已经实现了,分别是如图所示的值。对于复杂的类,会赋予null作为默认值。(这里char的默认值为'/u0000'也就是null)

    那么问题来了,为什么Java会有这样的操作呢,为什么不能将方法内的局部变量也自动赋值一个默认值呢?

    首先,我在网上找到了这样的一个答案如下,如果不想看原文,可以直接跳过至引用答案的结尾处直接看我的总结:

    这位作者在读《深入理解Java虚拟机》的时候记录了一个相关知识点。

    类的成员变量有默认初始值,而方法内的局部变量却没有初始值。这个问题涉及到JVM类加载和字节码执行两个阶段,这两个阶段是依次执行的。

    JVM类加载是JVM利用类加载器将class文件加载到JVM的过程,涉及“加载”、“验证”、“”准备“、“”解析“和”初始化“。

    一、类的成员变量初始化   ---在JVM类加载阶段完成

    类的成员变量又分为静态成员变量和非静态成员变量。

    静态成员变量

    静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二次在“初始化”阶段,根据代码中的赋值情况再进行一次初始化。

    例如:

    public static int i =3 ;

    第一次初始化后i的值为0,第二次初始化后,值才为3.

    数据最终存放在方法区中。

    非静态成员变量

    仅“初始化”阶段赋值。根据代码中的赋值情况,代码不赋值直接赋默认值,有赋值则等于代码中的赋值。对象实例化后,该变量随java对象分配到java堆中。

    二、方法区的局部变量没有初始化

    而方法中的局部变量没有初始化步骤,如下图:

    39e7ac4db2e4b88a6bdf9e13563427ec.png

    需要在代码中进行初始化。

    7ca08649af68fb71da37e2fd0d48a343.png

    ————————————————

    原因就是类方法中的代码,实在字节码执行的时候,才会被运行到,此时局部变量是存储在虚拟机栈-栈帧中的局部变量表中。局部变量定义了但是没有赋值是不能使用的。

    版权声明:本文为CSDN博主「一步一台阶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/liufang...

    这篇帖子主要是说明了两种变量在JVM编译代码的时候把他们放在了哪里。

    JVM加载类的时候,不管是静态类还是非静态类,都会给每个类分配内存,存在堆里面,都有初始化的这一步操作。

    对于方法内的局部变量,由于方法要放到堆栈中(堆栈这个词,其实意义就是栈,习惯称为堆栈,其实和堆没关系),只有字节码执行的时候才会被运行到,所以没有赋值是不能使用的。

    ………………??? 这是什么意思?也就是说,两种变量的存储位置不一样,会对是否初始化有影响,但是没有说明为什么成员变量在堆里就有初始化,方法内局部变量为啥放在堆栈里面,只有执行方法的时候才会被运行到就不能初始化呢?

    然后我就找到另一篇文章如下:

    为什么 Java 中全局变量不一定初始化,局部变量必须初始化?

    作者:Intopass

    链接:https://www.zhihu.com/questio...

    来源:知乎

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    首先 Java 语言就是这么规定的。

    然后为什么 Java 语言要这么规定呢?有什么内部机理吗?

    可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。

    而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。

    那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。

    for (int i = 0; i < 10; i++) {

    int n;

    if (i % 2 == 0) {

    n = 10;

    } else {

    n = 20;

    }

    }

    像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)

    通过看这位作者的讲解,我们就能够理解得更清楚一些了。为什么堆内的成员变量可以初始化?因为容易,申请内存的时候顺便就实现了初始化。为什么栈内的局部变量不能初始化?因为麻烦,而且没有必要。

    最后,我又看到了一个内容,同知乎页面另一个匿名作者的回答:

    套用《Thinking in Java》作者Bruce Eckel的话

    编译器当然可以为局部变量附一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽,所以采用默认值范围会掩盖这种失误。因此强制程序员提供一个初始值,往往能够帮助找出程序里的缺陷。

    其实我觉得这句话应该是对于为什么局部变量不能够初始化的最合理的解释了吧。

    总结一下,为什么局部变量需要手动初始化?从技术上来讲,局部变量一般来说总量大,生命周期短,JVM进行初始话开销较大;从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能。一举三得,何乐而不为?

    回到开头,所以说大佬就是大佬,随随便便问一个问题,看似是一个小问题,但是深究下去竟然牵扯到这么多深层次的知识点,甚至有点哲学的意义在里面,佩服佩服!

    展开全文
  • 数据段又分为:.data 段 和 .bss段,其中.data段存储已初始化全局变量和静态变量,.bss 段存储未初始化全局变量。在C中,凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类...

    目标文件、可执行程序及其他二进制文件以ELF格式存储在磁盘中,该文件有两个重要的段(section),即代码段和数据段。

    数据段又分为:.data 段 和 .bss段,其中.data段存储已初始化的全局变量和静态变量,.bss 段存储未初始化的全局变量。

    在C中,凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态(static)变量。——C和指针(p43)

    这句话中有两个概念需要搞清楚:

    静态内存:指的是前文所述的数据段(.data 段 和 .bss段),不包括堆栈。

    静态(static)变量:没有static关键字的变量也可以是静态变量,关键是存储于静态内存中。实际上,当static关键字用于不同上下文环境时,具有不同的意思。

    同时,我们还知道,静态变量在程序运行之前被创建,其分为两种:已初始化的 和 未初始化的。

    已初始化的包括:static变量 (这里不能称其为静态变量)、 已初始化的全局变量;static变量是默认zero-initialization的,所以就算未显示初始化,也会被zero-initialization; 全局变量 <=字面值(或常量),即赋予字面值时会在编译阶段就被初始化,如:int g_var = 4;

    未初始化的:即未初始化的全局变量。

    如前文所述,前者存储于.data段,后者存储于.bss段。且前者的初始化是在编译阶段就完成的,后者的初始化时刻不一定,我们在后文中讨论。但两者的共同点是,都是在运行前创建的。

    这时,我们也许想问,运行前是如何创建静态变量的?

    我们知道,编译-汇编后生成二进制目标文件(ELF格式),虽然还不是最终的可执行文件,但已经有了代码段和数据段,而此时数据段中的.data段中已经有了‘已初始化的静态变量’的磁盘存储空间,并被填充了初始化值,在进程加载时直接被映射至内存空间中。

    而.bss段实际上未占据任何磁盘存储空间,也就是徒有其名,无有其实,只是在ELF的section header table 中记录其应该分配到的磁盘存储空间,而直到可执行程序被加载到内存中时,加载器将依据.bss段的section header中的信息,在内存中为其分配空间。

    总结来说就是,运行前创建分为两种:编译时创建——>加载时映射至内存;加载时创建。

    此时,我们仍有疑惑,静态变量的创建肯定是在运行前了,那么未初始化变量的初始化到底是在什么时候进行的?

    有三个猜测:

    链接时?前文中讲,直至进程加载至内存时才分配空间,自然无谈初始化。

    加载进程至内存时:

    (C和指针)在静态变量的初始化中,我们可以把可执行文件想要初始化的值放在当程序执行时变量将会使用的位置(注:实际上就是磁盘文件.data 段),当可执行文件载入到内存时,这个已经保存了正确初始值的位置将赋值给那个变量……如果不显式地指定其初始值,静态变量将初始化为0。

    这段话说的比较晦涩,因为它不想引入过多程序装载过程的知识。但我们也可以借此判断,未初始化的全局变量实际上和static一样会被初始化为0,只不过它是在可执行文件载入到内存时发生的。

    运行时,所谓运行时初始化,即动态初始化(dynamic-initialization),然而C与C++不同,静态变量不支持动态初始化。所以运行时也是不可能的。

    //in C

    int x = 5;

    static y = x; //error

    //in C++

    int x = 5;

    static y = x; //correct

    最终总结:

    在C中,静态变量,即全局变量和static变量,是在程序运行前创建的,其中已初始化的全局变量和static变量在编译汇编成目标文件时,初始值就已经保存在磁盘的.data段了,进程加载时将其映射到内存空间即可;

    未初始化的全局变量需要进程加载时真正的为.bss段分配内存空间,并赋值为0。静态变量的创建和初始化都是在运行前完成的,切记C中不能动态初始化,这一点与C++不同。

    展开全文
  • 我需要初始化h0到h4的全局变量初始化整数的值后,它将变为h0和h3值的不同int,而不是h1,h2或h4。我不知道什么,作为一个快速谷歌搜索显示,h0和h3不是特殊字符。相关代码:h0 = 0h1 = 0h2 = 0h3 = 0h4 = 0#...
  • 变量分为局部与全局,局部变量又可称之内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法...全局变量使用注意全局变量的存在主要有以下一些原因:1,使用全局变量会占用更多的内...
  • keil C51中初始化全局变量的“坑”

    千次阅读 2021-01-16 15:41:51
    keil C51中初始化全局变量的“坑” 在用keil C51开发SS881X/SS880X系列(或者其他8051架构)芯片的时候,对于一些全局变量的初始化,会有如下两种不同的声音: 第一种:在定义这个全局变量的时候,同时将该变量赋值...
  • from multiprocessing import Pool def init_pool(the_list): global some_list some_list = the_list def access_some_list(index): return some_list[index] ... indexes = [3, 2, 1, 0] po.
  • Test1实质上没有初始化全局变量,编译时编译器只是为了init_array_g1[]指出了将要使用的内存位置,而不发生 数据绑定。Test2则不同,它将init_array_g1[0]初始化为1,其它元素全部初始化为0,因此,编译器将把 init_...
  • rust初始化全局变量

    2021-10-27 11:23:14
    编写项目需要在程序运行时就初始化一个全局变量供后面使用,采用了lazy_static 修改cargo.toml文件,加入依赖 [dependencies] lazy_static = "1.4.0" 在main.rs文件中使用 #[macro_use] extern crate lazy_...
  • 但是使用 gcc 命令编译后报出如下错误(使用C99标准) 看了别人的博客后才知道是如下原因:c99标准中规定:全局变量和static变量的初始化需要指定一个常量,不能是一个非常量的表达式;而在c++中是可以的。而且在操作c...
  • 我们需要给它初始化为null以至于后面需要不断的进行判空但是用延迟初始化可以很好的解决这个问题我们只需要再全局变量前面加上 lateinit 示例代码:private lateinit var adapter : BaseAdapter onCreate{ adapter=...
  • 为初始化全局变量和静态变量 编译器会同等处理, 放入BSS段(这是全零的内存段),所以会被默认初始化为0 默认初始化规则 栈中的变量(函数体中的自动变量)以及堆中的变量(动态内存)会保有不确定的值 全局变量...
  • 我可以通过调用C语言中的函数来初始化静态全局变量吗? 例如:static int var_01 = fun();当我在VC6中使用它时它成功了。 但它在GCC 4.6.1中失败了。这很奇怪。 我猜这种用法在C89中是非法的? 或其他原因造成这种...
  • 什么Java中全局变量不一定初始化,局部变量必须初始化? 类的成员变量有默认初始值,而方法内的局部变量却没有初始值。这个问题涉及到JVM类加载和字节码执行两个阶段,这两个阶段是依次执行的。 JVM类加载是JVM...
  • 一.Java变量的声明在 Java 程序设计中,每个声明的变量都必须分配一个类型。声明一个变量时,应该先声明变量的类型,随后再声明变量的名字。下面演示了变量的声明方式。double salary;int age;Boolean op;其中第一项...
  • 在C++中对于以下语句:// 全局域int i = 3;int j = i;编译时将i放入.data段,设置其值3。而对于j,编译器遇到...编译器不能够直接用3来初始化j,因为计算机不是人,不懂简单的人类逻辑,我们想“因为i = 3,而j ...
  • 全局变量的使用,头文件不要对变量进行初始化,解决重复定义问题
  • 比如,在C语言之类的程序编译完成之后,已初始化全局变量保存在.data 段中,未初始化全局变量保存在.bss 段中。 text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中...
  • 因为java规定,变量没有初始化不能使用,全局变量也就是类的属性,java会在编译的时候,自动将他们初始化,所以可以不什么变量初始化的操作。但是(局部)变量必须初始化这个在工作中也得到了很好的验证:如果是在类的...
  • .bss段是放未初始化或者初始化为0全局变量; .data段是存放初始了且不零的全局变量。bss段中的值全部赋为了0。程序中就不存在没有初始化全局变量了,你不初始化,bss段也会帮你初始化为0。 ...
  • 话不多说,代码如下:def test1():a = 300 # 定义一个局部变量a,并初始化300print("--test1--修改前:a=%s" % a)a = 200 # 给变量a重新赋值200print("--test1--修改后:a=%s" % a)def test2():a = 400 # 定义另一个...
  • 四种作用域:Web应用中的变量存放在不同的jsp对象中,会有不一样的作用域,四种不同的作用域排序是pageContext < request < session < application;1、pageContext:页面域,仅当前页面有效,离开页面后,...
  • 1、全局int变量(包括有static前缀的)未初始化, 默认值是0。 2、局部int变量未初始化,默认值未知。(除了加static 前缀的局部变量,因为此时的局部变量是放在静态存储区内的,跟全局变量一样) 解释:局部变量是...
  • 这个问题是面向类内全局变量的声明和初始化的。据我所知,将所有全局变量放在类定义的开头,然后按任意顺序(我更喜欢getter和setter,然后是构造函数,然后是事件,然后是misc函数),这几乎是常见的做法(除了*.designer.cs...
  • pytest-api设置全局变量

    2021-10-28 21:27:14
    pytest-api设置全局变量写入系统变量读取系统变量 写入系统变量 在conftest.py文件中定义登陆请求,作用域设置为全局scope=“session”,执行时只需登陆一次,获取到cookie后将其存入到系统变量,后续可进行全局使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 501,771
精华内容 200,708
关键字:

未初始化的全局变量设置为0