精华内容
下载资源
问答
  • 局部变量被定义时,系统不会对其初始化,此时局部变量的初始值未定义,必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

    当局部变量被定义时,系统不会对其初始化,此时局部变量的初始值未定义,必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

    展开全文
  • 局部变量和全局变量初始化

    千次阅读 2018-05-15 09:09:41
    写代码的时候遇到了这个问题,选两段抄过来做个笔记。定义局部变量,其实就是在栈中通过移动栈...在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:int x =0; 跟 int x; 的效果看起来是一样...

    写代码的时候遇到了这个问题,选两段抄过来做个笔记。

    定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。

    在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:int x =0; 跟 int x; 的效果看起来是一样的。但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下:

      编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符号。连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规则:

      1、如果有多个重名的强符号,则报错。

      2、如果有一个强符号,多个弱符号,则以强符号为准。

      3、如果没有强符号,但有多个重名的弱符号,则任选一个弱符号。

    所以不管是写全局变量还是局部变量,最好都初始化一下。


    展开全文
  • 初始化变量的方式是将变量赋值 ...当局部变量被定义时,系统不会对其初始化,用户必须自行对其初始化,定义全局变量时,系统会自动初始化为以下值 数据类型 初始化默认值 int 0 char '\0'

    初始化变量的方式是将变量赋值

    int x=5;

    不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为NULL(所有字节的值都是0),其他所有变量的初始值都是未定义的

    当局部变量被定义时,系统不会对其初始化,用户必须自行对其初始化,定义全局变量时,系统会自动初始化为以下值

    数据类型 初始化默认值
    int 0
    char '\0'
    float 0
    double 0
    pointer NULL
    正确初始化变量是个良好的编程习惯,否则有时候可能会产生意想不到的结果
    展开全文
  • 全局变量和局部变量初始化问题

    千次阅读 2019-08-23 16:08:42
    这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用不了,后面会验证。现在,我们要讨论的是程序猿或者程序媛需不需要给全局变量和局部...

    总结 

    这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用不了,后面会验证。 现在,我们要讨论的是程序猿或者程序媛需不需要给全局变量和局部变量赋初值的问题。因为全局变量的初始值是系统默认的且是可使用的,因此,全局变量一般不需要自己去赋初值,不过为了养成良好的代码习惯,最好还是赋初值,定义的全局变量在代码中未被使用,编译器也不会报错。局部变量被定义,没有赋初值,系统会抛出警告“xxx未使用的局部变量”,同时未赋初值的局部变量,是不能在其它地方作为右值使用的,系统会抛出错误“使用了未初始化的局部变量”。因此,局部变量如果被定义,就必须要赋初值,下面通过一段代码来验证。

    #include <iostream>
    #include <string>
    #include <vector>
    
    int a;
    bool b;
    char c;
    double d;
    
    std::string str;
    std::vector<int> vec;
    
    int main()
    {
    	int a2;
    	bool b2;
    	char c2;
    	double d2;
    	std::string str2;
    	std::vector<int> vec2;
    
    	//Microsoft C++ 异常: std::out_of_range
    	//vec.at(0) = 1;
    	//vec2.push_back(1);
    	/*
    	std::cout << "a:"<<a << std::endl;
    	std::cout << "b:"<<b << std::endl;
    	std::cout << "c:"<<c << std::endl;
    	std::cout << "d:"<<d << std::endl;
    	std::cout << "a2:"<< a2 << std::endl;
    	std::cout << "b2:"<< b2 << std::endl;
    	std::cout << "c2:"<< c2 << std::endl;
    	std::cout << "d2:"<< d2 << std::endl;
    	*/
    	system("pause");
    	return 0;
    }

    全局变量 

    我把所有的全局变量都添加到监视中,调试后可以发现,普通数据类型变量的值系统会默认初始化为0。int类型初始化为0,bool类型初始化为false,char类型初始化为‘\0’,double类型初始化为0.00000000000000000。

    局部变量

    在局部变量窗口中可以看到,局部变量的初始化值都是随机的。普通数据类型中,int类型初始化为-858993460,bool类型初始化为true (204),char类型初始化为-52 '?',double类型初始化为-9.2559631349317831e+61。

    编译时,会给出警告信息:

    通过两个窗口数据可以看到,string类型和vector类型的变量初始化是一样的,string的size为0,capacity为15;vector的size为0,capacity也为0。

    把主函数里面这段代码的注释取消,发现int、bool、double的打印值都为0,char的打印值为空,也就是‘\0’。

    std::cout << "a:"<<a << std::endl;
    std::cout << "b:"<<b << std::endl;
    std::cout << "c:"<<c << std::endl;
    std::cout << "d:"<<d << std::endl;

     

    把主函数里面这段代码注释取消,直接Game over,系统报错。

    std::cout << "a2:" << a2 << std::endl;
    std::cout << "b2:" << b2 << std::endl;
    std::cout << "c2:" << c2 << std::endl;
    std::cout << "d2:" << d2 << std::endl;

    这里多说两句关于vector容器初始化的:

    size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。

    capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。

    这两个属性分别对应两个方法:resize()和reserve()。

    使用resize(),容器内的对象内存空间是真正存在的。

    使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。

    1、如果对容器直接赋值,会报out_of_range,也就是越界。

    vec.at(0) = 1;

    2、如果没有对容器赋初值,打印其中一个,也会报out_of_range,因为vector的size为0,capacity也为0。

    std::cout << "vec:" << vec.at(0) << std::endl;

    如果要打印第一个值,需要先resize一下,不能用reserve,此时的值为0,但还是不能赋值

    vec.resize(1);
    //vec.reserve(1);
    std::cout << "vec:" << vec.at(0) << std::endl;

    3、如果要赋值,需要先往vector里面push_back值,这个不需要resize都可以

    vec.push_back(1);
    std::cout << "vec:" << vec.at(0) << std::endl;
    vec.at(0) = 2;
    std::cout << "vec:" << vec.at(0) << std::endl;

     

    展开全文
  • 在 C 语言中,通常可以把内存理解为四个分区:栈、堆、全局/静态存储区常量存储区。 栈(stack,也称“堆栈”) 通常是用于存储在编译期间就能确定存储大小的变量,用于在函数作用域内创建,在离开作用域后自动...
  • 只有全局变量初始化时的默认值为0,而局部变量默认值是不确定的。所以,局部变量在使用之前一定要先赋值,如果基于一个不确定的值做后续运算必然会引入bug。 下面看一个错误的例子: #include int add_range(int...
  • 1.全局变量初始化在主函数之前 2.静态局部变量初始化在第一次调用这个静态局部变量之前 #include <iostream> using namespace std; class A { public: A(int a):m_a(a){cout << "A(int a):" << ...
  • 如上图所示, 1、全局int变量(包括有static前缀的)未初始化,默认值是0。 2、局部int变量未初始化,默认值未知。...解释:局部变量是存在栈中,数据量大,且生命周期短,若为局部变量进行初始化,开销很大。 ...
  • (1)C语言从语法上规定全局变量只能用常量表达式来初始化,因此下面这种全局变量初始化是不合法的: int minute = 360; int hour = minute / 60; (2)如果全局变量在定义时不初始化则初始值是0,如果局部...
  • 根据定义变量位置的不同,可以将变量分为成员变量和局部变量。 成员变量是 定义在一个类的变量:类中方法外 局部变量是定义在一个方法内的变量:方法中 成员变量分为: 静态属性:随类的存在而存在,是在类加载的...
  • 还有对全局变量是不是也是编译赋初值?没有初值是不是自动给它赋值(网上好像有这么讲的),那什么时候在内存开辟空间呢(这个图上的生存期从main函数就开始)? 这些可能涉及计算机组成原理,我没学过,希望哪位...
  • 在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:int x =0; 跟 int x; 的效果看起来是一样的。但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下: 编
  • Python局部变量和全局变量区别

    千次阅读 2018-05-29 15:31:52
    全局变量:在模块内、在所有函数外面、在class外面,这就是全局变量 局部变量: 在函数内、在class的方法内(未加self修饰),这就是局部变量 2. 如何使用: 在def中,我们可以定义一个局部变量,该变量仅仅在...
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法...答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量初始化可以划分为以下两
  • 全局变量、静态全局变量、静态局部变量和局部变量 全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域 局部变量存放在内存的栈区。 全局变量、静态变量如果没有手动初始化,则有编译器初始化为...
  • 局部变量和全局变量,以及作用范围

    万次阅读 多人点赞 2018-11-11 13:56:55
    变量按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 变量按作用域分:  全局变量:在整个工程文件内都有效;“在函数外定义的变量”,即从定义变量...
  • 【C语言】C语言局部变量和全局变量

    千次阅读 2016-02-13 16:41:30
    全局变量】 · 定义 · 作用域 · 生命周期 【外部变量】 · 定义 · 用extern修饰变量 【内部变量】 · 定义 · 用static修饰变量 1.局部变量 · 定义 在函数(代码块)内部定义的变量称为局部变量...
  • 局部变量和全局变量的作用域

    千次阅读 2014-03-13 16:58:54
    java中的作用域:指可访问变量...局部变量必须初始化,否则使用时编译会出错。 全局变量:分为实例变量类变量。区别在于类变量使用static关键字修饰,作用域是类范围的,所有该类的实例都可以共同使用这个变量,实例
  • java中局部变量和全局变量

    万次阅读 2016-12-11 23:59:18
    java区分局部变量和全局变量 1、局部变量:  局部变量的定义:定义在... 生存时间:局部变量的生存时间方法的生存时间一致,调用该方法声明该局部变量初始化的时,该局部变量被创建并分配内存空间;直到该...
  • 基本数据类型数值6类 (long/int/short/byte)(double/float) 非数值2类(char,boolean)下面是默认值:0/0/0/0/0.0/0.0/ /false首先 Java 语言就是这么规定的。然后为什么 Java 语言要这么规定...而成员变量就是类的数...
  • java的局部变量和全局变量

    千次阅读 2019-03-19 09:22:37
    关于Java代码变量问题——局部和全局 在说明问题之前,先看一道蓝桥杯的题目: 立方变自身 观察下面的现象,某个数字的立方,按位累加仍然等于自身。 1^3 = 1 8^3 = 512 5+1+2=8 17^3 = 4913 4+9+1+3=17 … 请你计算...
  • Java全局变量和局部变量初始化问题

    千次阅读 2020-02-21 23:24:53
    我们先来看一个比较的例子,最近在知乎看到的帖子。... //类的成员变量 public static void main(String[] args) { TestDemo td =new TestDemo(); //默认的构造方法 System.out.println(td.a); ...
  • OC中局部变量,全局变量和成员变量

    千次阅读 2015-11-13 00:55:43
    OC中局部变量,全局变量和成员变量
  • 比如如下程序代码片段 int a = 0 ;...a 全局初始化变量 ...p1 全局未初始化变量 ...b 局部变量 ...s1 局部变量 ...p2 局部变量 ...s2 局部变量 ...c 静态局部变量 ...全局变量同一个文件中先定义先初始化,不同不确定
  • 概念首先得明白局部变量,静态局部变量全局变量,静态全局变量这几个概念,以下面程序举例://main.cpp int a = 0; //全局变量 static int b=0;//静态全局变量 main() { int c; //局部变量 static int d;//静态...
  • 全局变量局部变量初始化问题

    千次阅读 2013-11-20 08:51:30
    因为xz为局部结构体变量,xz中的成员变量不会被自动初始化,而我们手动对其成员变量初始化,其成员变量被初始化为指定值(x的成员变量i初始化为0,y的成员变量j初始化为99),所以的得到的结果为99。   ...
  • 最近见群里有一道关于面试的试题,考察的关于全局变量和局部变量的基础知识: fun foo(){ var a = b = 0;} 让选择ab的值分别为多少,或许不仔细看,我们很可能把ab都当成了局部变量,值为0,其实a是局部变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,646
精华内容 71,058
关键字:

局部变量和全局变量的初始化