局部变量

变量的存储类别

蹲街弑〆低调 提交于 2020-02-25 20:22:58
一、在运行程序的时候,操作系统会将虚拟内存进行分区。 1).堆 在动态申请内存的时候,在堆里开辟内存。 2).栈 主要存放局部变量。 3).静态全局区 1:未初始化的静态全局区 静态变量(定义变量的时候,前面加static 修饰),或全局变量,没有初始化的,存在此区 2:初始化的静态全局区 全局变量、静态变量,赋过初值的,存放在此区 4).代码区 存放咱们的程序代码 5).文字常量区 存放常量的。 普通的全局变量 概念: 在函数外部定义的变量 int num=100;//num 就是一个全局变量 int main() { return 0; } 作用范围: 全局变量的作用范围,是 程序的所有地方。 只不过用之前需要声明。声明方法 extern int num; 注意声明的时候,不要赋值。 生命周期: 程序运行的整个过程,一直存在,直到程序结束。 注意:定义普通的全局变量的时候,如果不赋初值, 它的值默认为0 静态全局变量static 概念: 定义全局变量的时候,前面用static 修饰。 static int num=100;//num 就是一个静态全局变量 int main() { return 0; } 作用范围: static 限定了静态全局变量的,作用范围 只能在它定义的.c(源文件)中有效 生命周期: 在程序的整个运行过程中,一直存在。 注意:定义静态全局变量的时候

Java基础——对象和类

ⅰ亾dé卋堺 提交于 2020-02-24 23:05:25
  将包含main方法的类称为主类。   变量的作用域是指变量可以在程序中引用的范围。   实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。   局部变量的声明和使用都在一个方法的内部。   一个类的实例变量和静态变量称为类变量或数据域。在方法内部定义的变量成为局部变量。   局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值。(Java没有给局部变量赋默认值)   无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。但当一个数据域是基于对另一个数据域的引用来进行初始化时则不是这样。在这种情况下,必须首先声明另一个数据域。   类变量只能声明一次,但是在同一个方法内不同的非嵌套块中,可以多次声明相同的变量名。   可以在一个方法的不同块里声明同名的局部变量,但是,不能在嵌套块中或同一个块中两次声明同一个局部变量。   如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏。   可以把两个类放在同一个文件中,但是文件中只能有一个类是公共(public)类。此外,公共类必须与文件同名。源代码中的每个类编译成.class文件。   构造方法在使用new操作符创建对象的时候调用,它是一种特殊的方法,有以下三个特殊性:    (1)构造方法必须具备和所在类相同的名字

.Net4.0 Parallel编程(二)Data Parallelism 中

五迷三道 提交于 2020-02-22 16:52:12
在 上篇文章 中看过了使用Parrallel.For、Parael.Foreach在效率上给我们带来的提高。本文就来如何终止循环、线程局部变量 进行说明。 Thread-Local Variables 首先我们来看下线程局部变量,是的我们也许一直在想我们如何去定义一个线程局部变量呢。先看段顺序执行的代码: [TestMethod()] public void NormalSequenceTest() { int[] nums = Enumerable.Range(0, 1000000).ToArray(); long total = 0; for (int i = 0; i < nums.Length;i++ ) { total += nums[i]; } Console.WriteLine("The total is {0}", total); } 执行结果: 我们再来看这段代码: [TestMethod()] public void NormalParallelTest() { int[] nums = Enumerable.Range(0, 1000000).ToArray(); long total = 0; Parallel.For(0,nums.Length,i=> { total += nums[i]; }); Console.WriteLine("The total

JS中 undefined重写 与 void 0

戏子无情 提交于 2020-02-20 11:42:29
在看一些开源源码的时候经常会看到这样一个判断句: if( xxx !== void 0 ) {} 这里的目的是判断指定的变量是不是一个 undefined 之所以这么写,是因为,在ES5之前,undefined 是可以被重写的,在ES5之后修复了这个问题,但只是全局作用域下不可以了,在局部作用域内依然可以改写,比如: (function() { var undefined = 10; console.log(undefined); // 10 console.log(typeof undefined) // number })() void 后面不管跟的什么,返回的都是 undefined 来源: https://www.cnblogs.com/xwant/p/8985502.html

javascript篇-----执行环境和作用域

℡╲_俬逩灬. 提交于 2020-02-19 08:43:29
  执行环境是javascript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。   全局执行性环境是最外围的一个执行环境,根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样。在Web浏览器中,全局执行环境被认为是window对象,因为所有的全局变量和函数都是作为window对象的属性和方法创建的。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。   每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。ECMAScript程序中的执行流正是由这个方便的机制控制的。   当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是在保证对执行环境有权访问的所有变量和函数都有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即arguments对象。作用域链中的下一个变量对象来自包含环境,而在下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境

王垠-编程的智慧

泄露秘密 提交于 2020-02-18 21:54:12
编程的智慧 编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋。然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获。 ​ 反复推敲代码 有些人喜欢炫耀自己写了多少多少万行的代码,仿佛代码的数量是衡量编程水平的标准。然而,如果你总是匆匆写出代码,却从来不回头去推敲,修改和提炼,其实是不可能提高编程水平的。你会制造出越来越多平庸甚至糟糕的代码。在这种意义上,很多人所谓的“工作经验”,跟他代码的质量其实不一定成正比。如果有几十年的工作经验,却从来不回头去提炼和反思自己的代码,那么他也许还不如一个只有一两年经验,却喜欢反复推敲,仔细领悟的人。 有位文豪说得好:“看一个作家的水平,不是看他发表了多少文字,而要看他的废纸篓里扔掉了多少。” 我觉得同样的理论适用于编程。好的程序员,他们删掉的代码,比留下来的还要多很多。如果你看见一个人写了很多代码,却没有删掉多少,那他的代码一定有很多垃圾。 就像文学作品一样,代码是不可能一蹴而就的。灵感似乎总是零零星星,陆陆续续到来的。任何人都不可能一笔呵成,就算再厉害的程序员,也需要经过一段时间,才能发现最简单优雅的写法。有时候你反复提炼一段代码,觉得到了顶峰

C语言中关键字static的用法

女生的网名这么多〃 提交于 2020-02-17 01:53:10
在C语言中,static可以修饰变量(局部变量和全局变量)和函数 1.static修饰局部变量 作用:改变了局部变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束 代码1: #include<stdio.h> void test() { int i = 0; i++; printf("%d ", i);//1 1 1 1 1 1 1 1 1 1 } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; } 代码2: #include<stdio.h> void test() { static int i = 0; i++; printf("%d ", i);//1 2 3 4 5 6 7 8 9 10 } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; } 2.static修饰全局变量 作用:改变了全局变量的作用域 使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用 代码1: //sum.c int g_val = 2019; //test.c extern int g_val; int main() { printf("%d\n", g_val);//----

sql server和mysql变量赋值的区别 以及 MySql Declare

可紊 提交于 2020-02-16 18:04:38
sql server和 mysql 都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪。 sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的); 申明局部变量语法:declare @变量名 数据类型;例如:declare @num int; 赋值:有两种方法式(@num为变量名,value为值) set @num=value; 或 select @num=value; 如果想获取查询语句中的一个字段值可以用select给变量赋值,如下: select @num=字段名 from 表名 where …… mysql变量赋值不用事前申明,在用的时候直接用“@变量名”使用就可以了。 第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量 第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where …… (张英:似乎mysql中不能使用 select @p1 := c1, @p2:=c2 from tb 方式赋值) 注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值” mysql可以在SP中声明不带@的局部变量

Python—函数进阶

戏子无情 提交于 2020-02-15 23:53:41
楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bigger) 之前是不是我告诉你们要把结果return回来你们就照做了?可是你们有没有想过,我们为什么要把结果返回?如果我们不返回m,直接在程序中打印,行不行? 来看结果: >>> def my_max(x,y): ... m = x if x>y else y ... >>> my_max(10,20) >>> print(m) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'm' is not defined 报错了!错误是“name 'm' is not defined”。变量m没有被定义。。。为啥?我明明定义了呀! 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。 但是 当遇到函数定义的时候解释器只是象征性的将函数名读入内存 ,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

Java 虚拟机 - 2.2 运行时数据区 Runtime Data Area

牧云@^-^@ 提交于 2020-02-15 23:05:04
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 JVM是一个内存中的虚拟机, Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。 运行时数据区Runtime Data Area 一、程序计数器(Program Counter Register) Java虚拟机栈描述的是Java 方法执行 的内存模型:每个方法执行的同时会创建一个 栈帧 ,栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 Java虚拟机栈是 线程私有 的,它的生命周期与线程相同。 程序员主要关注的所谓的“堆和栈”里的“栈”,就是指 VM stack 虚拟机栈内存 ,更细致的讲,就是虚拟机栈中 局部变量表 部分。 局部变量表存放了编译时期可知的各种 基本数据类型 (boolean, byte, char, short, int, float, long, double), 对象引用 , 和 returnAddress类型 (指向了一条字节码指令的地址)。 局部变量表所需的内存空间在编译时期完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。