文档库 最新最全的文档下载
当前位置:文档库 › 变量作用域、链接属性、存储类型

变量作用域、链接属性、存储类型

变量作用域、链接属性、存储类型
变量作用域、链接属性、存储类型

/*

内容是从C和指针中摘抄和整理出来的。

*/

1:作用域

作用域决定程序中该标识符可以被使用的区域。

编译器可以确认四种不同类型的作用域:代码块作用域,函数原型作用域,文件作用域,函数作用域。

1.1代码块作用域

代码块是包含在开始花括号和对应的结束花括号中的一段代码。代码块中定义的变量具有代码块作用域(block scope)。

函数定义的形式参数在函数体内部也具有代码块作用域。

注意:当内层代码块中有一个标识符的名字与外层代码块的一个标识符同名,则外层的那个标识符无法在内层代码块中通过名字访问,即内层的那个标识符会将外层的屏蔽掉。所以避免在嵌套的代码块中出现相同的变量名。

1.2文件作用域

在所有代码块之外声明的标识符都具有文件作用域(file scope)。这表示这些标识符从它们声明之处到所在源文件结尾处都是可以访问的。

1.3原型作用域(prototype scope)

只适用于在函数原型中声明的变量名。作用域从变量定义处到原型声明的末尾。意味着编译器在处理一个函数原型的参数时,它所关心的知识该该参数的类型。

1.4函数作用域(function scope)

只适用于标签语句,一般不用。

小结:一般只要注意前面2种。并注意函数定义中声明形参和函数原型中声明参数的区别。

2:链接属性

链接属性决定如何处理在不同文件中出现的标识符。

链接属性有三种:外部链接external,内部链接internal,空链接none。

2.1 external

external属性的标识符无论声明多少次,位于几个源文件都表示一个实体。

2.2 internal

Internal属性的标识符在同一个源文件的所有声明都指同一个实体。位于不同源文件的多个声明则分属于不同的实体。

2.3 none

none属性的标识符总是被当作单独的个体,即该标识符的多个声明被当作独立不同的实体。

3 : 存储类型(storage class)

变量的存储类型决定变量何时创建、销毁。有三个地方可以存储变量:普通内层,运行时堆栈,硬件寄存器。变量的缺省存储类型取决于它的声明位置。

3.1 静态变量

在代码块之外声明的变量总是存储于静态内层中。这类变量无法将其指定其他存储类型。

静态变量在程序运行前创建,在程序执行过程中始终存在。

3.2 自动变量

代码块内部声明的变量的缺省类型是自动的。存储于堆栈中,当程序执行到声明自动变量的代码块时,自动变量才被创建。当程序离开相应代码块时,这些自动变量便会自行销毁。

函数的形参是不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。

3.3 寄存器变量

关键字register可以用于自动变量的声明,提示变量存储于寄存器中。

4 : static关键字

1 当用于函数定义,static 关键字修改链接属性,使得函数只能在声明函数的源文件中使用。

2 当用于代码块之外变量的声明时,将变量的链接属性改为internal,但是修改变量的存储类型并不能更改其作用域,仍只能在该代码块内按名字访问。

3 当用于局部变量的声明时,将变量的存储类型改为静态变量。变量的链接属性和作用域不受影响。

5 : external关键字

当用于源文件中第一个标识符的第一次声明时,它指定该标识符具有external链接属性。但是,若用于该标识符的第二次或者以后的声明时,它并不会更改由第一次声明说指定的链接属性。

eg:

static int i;

int func ()

{

external int i; //此声明不会改变变量i 的链接属性

}

第7章 常量、变量及存储器类型

第7章常量、变量及存储器类型 7.1 常量 常量是在程序执行过程中其值不能改变的量。常量的数据类型有整型、浮点型、字符型和字符串型等,C51编译器还扩充了一种位(bit)标量。 7.2 在51 MCU DEMO试验板上实现乘法运算:两个乘数分别为常量与变量,其积在数码管上显示(最大显示到50)。 7.2.1 实现方法 先宏定义CONST为常量2,然后定义1个无符号字符型变量x并赋初值1,再定义1个无符号整型变量y用于存放结果,使x的值与CONST相乘,其积存于y中。然后将y的内容送试验板上右侧2个LED数码管进行显示。每0.5秒后x 的值加1,直到26为止。 7.2.2 源程序文件 在D盘建立一个文件目录(CS7-1),然后建立CS7-1.uv2的工程项目,最后建立源程序文件(CS7-1.c)。输入下面的程序: #include //1 unsigned char code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//2 #define CONST 2 //3

/*=====================4===============*/ void delay(unsigned int k) //5 { //6 unsigned int i,j; //7 for(i=0;i

变量的作用域与存储类别&&变量的生存期——天擎国际

变量的作用域与存储类别(变量的作用域——变量的生存期) 变量的作用域 ——局部变量和全局变量 变量的生存期 ——静态存储类别和动态存储类别(注意区别存储类型和函数类型) 变量的作用域 一、局部变量 定义:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。 二、全局变量 定义:在函数之外定义的变量称为外部变量,或全局变量。它可为本文件中其他函数所共用。有效范围为从定义变量的位置开始到本源文件结束。 注意: 全局变量在程序的全部执行过程中都占有存储单元,而不是仅在需要时才开辟单元。 它使函数的通用性降低,因函数在执行时要依赖于其所在的外部变量。 降低了程序的清晰性。 在同名局部变量作用的范围内,外部变量被“屏蔽”。 变量的生存期

一、动态存储方式与静态存储方式 静态存储:在程序运行期间分配固定的存储空间的方式。 动态存储:在程序运行期间根据需要进行动态的分配存储空间的方式。 静态存储区:存储空间的分配在编译阶段进行,且存于其中的数据对象相对于程序的执行是永久的。 动态存储区:存储空间的分配是在程序的运行过程中进行的。 二、auto变量 调用函数时系统自动分配存储空间,在函数调用结束时自动释放这些存储空间,称这类局部变量为自动变量。 用关键字auto作存储类别的声明。它也可省。 三、用static声明局部变量 静态的 局部的 说明: 静态局部变量属于静态存储类别,在静态存储区内分配单元。在程序整个运行期都不释放。 自动变量属于动态存储类别,在动态存储区内分配单元,函数调用结束后即释放。 静态局部变量在编译时赋初值,以后每次函数调用时不再重新赋初值 ... .......而只是保留上次函 数调用结束时 ......的值。 自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值。 静态局部变量,如不赋初值,编译时自动赋初值0 或空字符。 自动变量,如不赋初值,它的值是一个不确定的值。 虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。 一般在下列情况时,使用局部静态变量: 1、需要保留函数上一次调用结束时的值时; 2、如果初始化后,变量只被引用而不改变其值时。 四、register变量 说明: 1、只有局部自动变量和形参可作为register变量。 2、不能定义任意多个寄存器变量。 3、局部静态变量不能定义为寄存器变量。 五、用extern声明外部变量 在一个文件内声明外部变量 例:main( ) { extern A; /*外部变量声明*/ printf(“%d”,A); }

C语言变量存储类型

1.存储类型和数据类型。存储类型是针对变量而言的,它规定了变量的存储位置,从而也确认了其作用域和生存期;数据类型也可以针对变量,它规定了变量所占内存空间的大小。 2.C中只有两种存储类型:自动类和静态类。全局变量只能是静态类,而局部变量可以任意。 3.说明变量存储类型的格式:<存储类型> <数据类型> <变量名表>;(存储/数据类型可以交换次序),与存储类别有关的说明符:auto(自动),static(静态),register(寄存器),extern (外部)。 4.计算机内存分三部分:动态存储区(堆栈)、静态存储区、程序代码区。动态存储区用来保存函数调用时的返回地址、自动类别的局部变量等;静态存储区用以存放全局变量及静态类别的局部变量;程序代码区存放各类代码。 5.C++中,可以用static说明"静态函数",其不允许嵌套定义,也不允许外部编译单元中的函数对它进行调用。 ******************************************************************************/ #include /****************************************************************************** 1.对于全局变量可以使用extern和static两种说明符。 2.全局变量的定义只能出现一次,在定义全局变量时,不可使用extern说明符。 3.全局变量的说明(使用extern)可多次出现在需要的地方,说明的作用是扩展该全局变量的作用域,可以对同一变量进行多次extern声明。 4.全局变量的生存期是整个程序的运行时间。 5.全局变量可以进行不同函数之间的传值。 ******************************************************************************/ int i=10; //注意:extern int i=10;是一个具体变量的定义,不是外部变量的声明 int main() { /****************************************************************************** 1.static局部变量只有在第一次执行时才进行初始化,若定义时没有指定初值,编译器自动为其赋0。 2.static变量的初值是在编译时赋予的,而auto量的初值是在程序执行过程中赋予的。 3.static局部变量的生存期是整个程序的运行时间。 ******************************************************************************/ static int i=20; { /****************************************************************************** 1.auto只能用于局部变量的声明,其存储在栈区中。 2.auto局部变量不能保存函数值,当程序执行超出其作用域时,其所占用的内存空间就会被释放。 3.auto局部变量每次进入作用域都要重新分配存储单元。若通过定义语句为auto变量赋初值,那么每进入一次作用域,就为其赋一次初值。 4.进行初始化,若定义时没有指定初值,编译器自动为其赋0,auto局部变量的初值是在程序执行过程中赋予的。 5.auto局部变量可以在各函数之间造成信息隔离,因此允许不同函数中可以使用同名变量,而不会相互影响。

对变量的说明包括数据类型存储类型作用域

对变量的说明包括:数据类型,存储类型,作用域。 第二讲主要是讲数据类型 数据类型:基本数据类型(包括常量和变量),构造数据类型(包括数组类型,结构类型,联合类型),指针类型,空类型(其类型说明符为void)四大类。 整形量包括:整形常量,整型变量。整形常量就是整常熟。使用的整常数有八进制,十进制,十六进制三种。其中八进制整常数必须以0开头。1、八进制整常数是无符号数。2、十六进制整形数前缀0或者是0X。基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。长整数158L和基本整常数158 在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意,避免出错。无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:358u,0x38Au,235Lu 均为无符号数 整型变量 整型变量可分为以下几类: 1.基本型 类型说明符为int,在内存中占2个字节,其取值为基本整常数。 2.短整量 类型说明符为short int或short'C110F1。所占字节和取值范围均与基本型相同。 3.长整型 类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。 4.无符号型 类型说明符为unsigned。 无符号型又可与上述三种类型匹配而构成: (1)无符号基本型类型说明符为unsigned int或unsigned。 (2)无符号短整型类型说明符为unsigned short (3)无符号长整型类型说明符为unsigned long 各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。 类型说明符数的范围分配字节数 int -32768~32767 ■■ short int -32768~32767 ■■ signed int -32768~32767 ■■ unsigned int 0~65535 ■■ long int -2147483648~2147483647■■■■ unsigned long 0~4294967295 ■■■■ 在书写变量说明时,应注意以下几点: 1.允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 2.最后一个变量名之后必须以“;”号结尾。 3.变量说明必须放在变量使用之前。一般放在函数体的开头部分。 实型量 实型常量:1、十进制形式2、指数形式,实型常量(double)不分单、双精度,都按双精度

从内存理解C语言中变量的存储类型

首先要来理解一下可执行文件加载进内存后形成的进程在内存中的结构,如下图: 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。 数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。 BBS区:存放的是未初始化的全局变量和静态变量。 栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。 堆区:堆是由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。 c语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有数据区、BBS区、栈区、堆区。下面来一一举例看一下这几个存储类型:

1. auto存储类型 auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。示例如下: [cpp]view plaincopy 1#include 2 3int main(void) 4{ 5auto int i=1; //显示指定变量的存储类型 6int j=2; 7 8printf("i=%d\tj=%d\n",i,j); 9 10return 0; 11} 2. extern存储类型 extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。 示例如下: [cpp]view plaincopy 12#include 13 14int i=5; //定义全局变量,并初始化 15 16void test(void)

web前端面试100问

面试造火箭,工作拧螺丝! 在技术圈毕竟只有百分之一的人能进入BAT,百分之九九的小伙伴只能在普通公司做这普通的事情,厌烦哪些标题党,我们抛开那些高大上的台词,回归到面试的本质。 本课程帮助小伙伴们快速梳理知识,不会设计到具体的很细节的知识点,关注面试本身。 公司一般会从以下5个方面考察一个人的能力,本课程的100问是总结了最近2-3年常问的面试题,适合初中级前端工程师。 1、HTML(5)和CSS3方面 1.前端与后端数据交互的格式有哪些,为什么大部分现在都用json而不用xml。 答:XML:知了堂3岁 JSON:{ name:”知了堂”,age:3} JSON书写方便节省字节,更轻量,前后台都有直接解析JSON的方法(JSON.stringfity/parse)使用方便。 2.Flex布局熟悉吗,说几个常用的属性。 答:这个几乎每天都在用,还是挺熟悉的。 display:flex align-items 多个 align-content:单个 justify-content justify-items flex-direction flex-wrap: flex-basic:初始盒子宽度flex flex-grow:增长因子200 4*40=160 1,1,1,2 1/5*40 flex flex-shrink :缩减因子200 60*4=240 3.说一下CSS盒模型 答:CSS的盒模型包含了一下几个内容margin,padding,border,content。 在计算盒子宽高的时候,IE和Chrome会有一些区别,IE算到border,Chrome的宽度只包含content区域,因此CSS3提供了box-sizing这个属性来修改。

变量的作用域和生存期

变量的作用域局部变量和全局变量 在函数和复合语句内定义的变量,只在本函数或复合语句范围内有效(从定义点开始到函数或复合语句结束),他们称为内部变量或局部变量。 在函数之外定义的变量是外部变量,也称为全局变量(或全程变量)。 如果在一个函数中全局变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即他不起作用,此时局部变量是有效的。 全局变量的作用是增加函数间数据联系的渠道。 虽然全局变量有以上优点,但建议不必要时不要使用全局变量,因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。 在程序设计时,对模块的划分要求:内聚性强,与其他模块的耦合性弱,这样便于程序的移植,可读性强。 变量的生存期 变量的存储方式分为两种:静态存储方式和动态存储方式。 静态存储方式是指在程序与性能期间由系统在静态存储区分配存储空间的方式,在程序运行器件不释放;而动态存储方式则是在函数调用期间根据需要在动态存储区分配存储空间的方式。这就是变量的存储区别。 Auto----声明自动变量 函数中的形参和在函数中定义的变量都属于此类。在调用这些函数时,系统给这些变量分配存储空间,函数调用结束时就自动释放这些存储空间。因为这类局部变量称为自动变量(auto 变量)。关键字auto作为存储类别的声明。 Auto可省略 Static-----声明静态变量 希望函数中的变量的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。这时就用关键字static指定该局部变量为“静态存储变量”。 对静态局部变量的说明 静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占胴体啊存储区空间而不占静态存储区空间,函数调用结束后即释放。 对静态局部变量是在编译时赋初值的,即只赋初值一次,在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。自动变量赋初值是在函数调用时进行的。 对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋值则他的值是一个不确定的值。 Registic--声明寄存器变量 这种变量一般不用,只需了解就可以了。 Extern-----声明外部变量的作用范围 如果一个程序中有两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序的连接时会出现“重复定义”的错误。正确的做法:在人一个文件中定义外部变量Num,而在另一个文件中用extern对Num作外部变量声明,即extern Num.

C语言数据类型、存储类型

一、数据类型 基本类型:int、char、int、float、double 构造类型:数组(一维数组、二维数组、指针数组、函数指针数组、结构体数组……)、结构体、共用体 指针:一维指针、二维指针、数组指针、函数指针、结构体指针 空类型:void,该类型也叫缺省型,用于描述值为空集,主要用于说明不返回值的函数或指向任一类型的指针等 1、32位计算机,各种数据类型所占字节数是: char = 1;short = 2;int = 4;long = 4;float = 4;double = 8(实型数据的存储方式不同于其他基本数据类型) 2、bool类型 bool类型数据的值,是真或者非真,-即:0/1(非0即为真) 定义时需加上:#include 用的时候不需要专门声明。 3、char型数据 字符型数据,就是占用1个字节,8位,赋值范围要注意 unsigned char(无符号) signed char(有符号) 如果给char型数据赋值超过范围,则会溢出。溢出原则,“保留低位,舍弃高位” 4、字符常量 char a = 'a'和char a = 97等价,字符常量'a'的ASCII码是97 5、字符串常量 定义:用双引号括起来的字符,就是字符串常量。 char *p = “hello”; “helllo”“你好吗,世界!” 每个字符串常量后面都会有一个“******\0” \0用来表示字符串结束 6、define与typedef(注意两者格式的区别) typedef是关键字,为已有类型取别名(如typedef unsigned int unit) define是宏定义,仅仅进行简单的文本替换(#define TYPE 100) 举例:#define unit_pint* unit_pa,b表示的是int *a,b;(b为int型) typedefint * unit_p unit_pa,b;表示的是int *a;int *b; #include #define N 3.0e-23 #define M 950 int main(int argc, const char *argv[]) { double a; scanf("%lf",&a);

windows2003域控制器的冗余

对于部署了AD架构的企业来说AD/DNS/DHCP/WINS都是我们必须用到的服务,一但这些服务中断会导致整个企业IT系统无法正常运作,如何保障这些基础服务的高可用性是我们每一位管理员需要考虑的。 一般的中小企业最少都会用两台或多台服务器做冗余保证企业内基础服务的高可用性,当一台服务器坏了或需要维护另一台服务器照样能够提供相同的服务来保障企业IT系统的正常运作。 下面是一张很经典的AD部署场景图,图里用了两台计算机做服务器,同时提供了AD/DNS/DHCP/WINS服务。对AD/DNS/DHCP/WINS服务不了解的朋友请先学习一下理论知识,要动手实验朋友请先把下面的图看懂了再动手,本帖子适合对AD入门的朋友,老鸟们就直接跳过吧^_^。

下面是两台服务器的配置过程 在配置前请先在两台计算机上安装好Windows 2003 操作系统,升级打好最新补订! 一、WinOSDC2服务器的配置过程 1、AD的配置 2、DNS的配置 3、DHCP的配置 4、WINS的配置 二、WinOSDC3服务器的配置过程 1、AD的配置 2、DNS的配置 3、DHCP的配置 4、WINS的配置 三、验证两台服务器是否能够提供冗余服务、 一、WinOSDC2服务器的配置过程——1、AD的配置 1、登录到WinOSDC2服务器,安装DNS/DHCP/WINS网络服务;

2、配置本机的网络IP,子网掩码,网关,DNS,WINS;

3、在“开始菜单”“运行”输入AD配置命令dcpromo ; 4、下一步

5、选择“新域的域控制器”“下一步” 6、选择“在新林中的域”“下一步”

C语言变量的存储类别

C语言变量的存储类别 内存中供用户使用的存储空间分为代码区与数据区两个部分。变量存储在数据区,数据区又可分为静态存储区与动态存储区。 静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。 动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。 对于静态存储方式的变量可在编译时初始化,默认初值为O或空字符。对动态存储方式的变量如不赋初值,则它的值是一个不确定的值。 在C语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种。静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器。 变量存储类别定义方法: 存储类别类型变量表; 例如: (1)a,b,c为整型自动存储类别变量: auto int a,b,c; (2)x,y,z为双精度型静态存储类别变量: static double x,y,z; 1、变量有哪些存储类型? 变量的存储类型由“存储类型指明符”来说明。存储类型指明符可以是下列类键字之一: auto register extern static 下面是详细的解释:

auto 存储类指明符--用于说明具有局部作用域的变量,它表示变量具有局部(自动)生成期,但由于它是所有局部作用域变量说明的缺省存储类指明符,所以使用得很少。要注意的是,所有在函数内部定义的变量都是局部变量,函数内部定义的变量其作用域只在函数内部。它的生存期为该函数运行期间,一旦离开这个函数或这个函数终止,局部变量也随之消失。 register 存储类指明符--当声明了这个指明符后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。注意,寄存器与存储器是不同的。寄存器一般在CPU内部,而存储器一般指外部的(比如内存条),CPU内部的寄存器其运算速度是很高的。当寄存器已分配完毕,就自动地分配一个外部的内存。它的作用等价于auto,也只能用于局部变量和函数的参量说明。 static 存储类指明符--表示变量具有静态生成期。static变量的的特点是它离开了其作用域后,其值不会消失。 当回到该作用域之后又可以继续使用这个static变量的值。 例:利用static变量统计调用函数的次数 int two(); /*函数原型说明*/ void main() { int a=0; a=two(); /*a的值等于1*/ a=two() /*a的值等于2*/ a=two(); /*a的值等于3*/ } int two() { static int b=0;/*定义了一个局部的static变量*/ b ; return b;

JSP的四大作用域:page、request、session、application

JSP的四大作用域:page、request、session、application page作用域:代表变量只能在当前页面上生效 reques t:代表变量能在一次请求中生效,一次请求可能包含一个页面,也可能包含多个页面,比如页面A请求转发到页面B session:代表变量能在一次会话中生效,基本上就是能在web项目下都有效,session的使用也跟cookie有很大的关系。一般来说,只要浏览器不关闭,cookie 就会一直生效,cookie生效,session的使用就不会受到影响。 application:代表变量能一个应用下(多个会话),在服务器下的多个项目之间都能够使用。比如baidu、wenku等共享帐号。 Cookie在jsp中语法: Cookie cookie_name =new Cookie("Parameter","Value"); 例: Cookie username_Cookie =new Cookie("username","waynezheng"); response.addCookie(username_Cookie); 读取cookie 从提交的HTML表单中获取,用户名 String userName=request.getParameter("username"); 以"username", userName 值/对创建一个Cookie Cookie theUsername=new Cookie("username",userName); 在JSP中,使用setMaxAge(int expiry)方法来设置Cookie的存在时间,参数expiry 应是一个整数。正值表示cookie将在这么多秒以后失效。注意这个值是cookie 将要存在的最大时间,而不是cookie现在的存在时间。负值表示当浏览器关闭时,Cookie将会被删除。零值则是要删除该Cookie。如: Cookie deleteNewCookie=new Cookie("newcookie",null); deleteNewCookie.setMaxAge(0); 删除该Cookie deleteNewCookie.setPath("/"); response.addCookie(deleteNewCookie); 实例: <%

变量存储类型的理解

《标准C语言程序设计》上机报告 实验四变量存储类型的理解和使用 以及数组初步 专业:通信工程 班级:通信 学号:U201 姓名: 完成日期:2011.5.1

1 一、实验目的 1.熟悉变量的各种存储类型的定义和申明 2.理解各种存储类型变量的作用域和生存期; 3.掌握局部变量和全局变量; 4.掌握动态存储和静态存储; 5.掌握一维数组和二维数组的定义、初始化和数组元素的引用; 6.理解并掌握数组名和数组下标的含义; 7.与数组有关的算法初步(排序) 8.掌握C开发环境中调试、跟踪数组元素取值和元素空间地址的使用 二、实验内容及要求 1.上机调试跟踪复合语句中的同名变量,掌握理解复合语句中局部变量的作用 域以及变量存储空间的生存期。写出你对同名变量使用的深入理解。 2.上机运行下面程序,调试跟踪static变量a和其它存储类型变量b、c的取值 变化,加深理解不同存储类型变量的作用域和生存期语法概念,并给出你对静态局部和自动变量这两种局部作用域存储类型的深入理解。 3.教材习题四的第三题,给出运行结果,单步跟踪了解调试器对函数内部auto 和static两种局部变量x和y的附带初值的定义语句执行过程有何区别?进一步深入理解两种局部变量auto、static的区别。 4.理解符号常量的作用域。 5.调试课堂下面代码了解下标越界问题. #include #include void main() { int i; int a[10]; for(i=0;i<=10;i++,printf("%d\n",i)) a[i]=i-1; printf("用于输入的循环执行完毕!\n"); printf("i=%d\n",i); printf("开始执行输出循环...\n");

执行环境,作用域理解

Javascript学习---2、执行环境,作用域 作者:名刘天下来源:博客园发布时间:2010-12-10 17:03 阅读:155 次原文链接[收藏]在javascript的学习中,执行环境、作用域是2个非常非常重要和基本的概念,理解了这2个概念对于javsacript中很多脚本的运行结果就能明白其中的道理了,比如搞清作用域和执行环境对于闭包的理解至关重要。 一、执行环境(exection context,也有称之为执行上下文) 所有JavaScript 代码都是在一个执行环境中被执行的。执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域、生存期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为。 在javascript中,可执行的JavaScript代码分三种类型: 1. Global Code,即全局的、不在任何函数里面的代码,例如:一个js文件、嵌入在HTML页面中的js代码等。 2. Eval Code,即使用eval()函数动态执行的JS代码。 3. Function Code,即用户自定义函数中的函数体JS代码。 不同类型的JavaScript代码具有不同的执行环境,这里我们不考虑evel code,对应于global code和function code存在2种执行环境:全局执行环境和函数执行环境。 在一个页面中,第一次载入JS代码时创建一个全局执行环境,全局执行环境是最外围的执行环境,在Web浏览器中,全局执行环境被认为是window对象。因此,所有的全局变量和函数都是作为window对象的属性和方法创建的。 当调用一个JavaScript 函数时,该函数就会进入与该函数相对应的执行环境。如果又调用了另外一个函数(或者递归地调用同一个函数),则又会创建一个新的执行环境,并且在函数调用期间执行过程都处于该环境中。当调用的函数返回后,执行过程会返回原始执行环境。因而,运行中的JavaScript 代码就构成了一个执行环境栈。 function Fn1(){ function Fn2(){ alert(document.body.tagName);//BODY //other code... } Fn2(); } Fn1(); //code here

变量的生命周期与作用域

作用域和生存周期是完全不同的两个概念。作用域可以看作是变量的一个有效范围,就像网游中的攻击范围一样;生存周期可以看成是一个变量能存在多久,能在那些时段存在,就像网游中的魔法持续时间……简单的以一个局部变量来举个例子:在main函数中声明了变量a,那么a的作用域就是main函数内部,脱离了main函数,a就无法使用了,main函数之外的函数或者方法,都无法去使用a。那么a的生存周期是指a在那些时候存在,具体到这个例子,a什么时候存在,要取决于main函数,或者说,main函数只要被调用,且调用没有完成,那么a就将存在。除此以外的情况,a都将被释放。生存周期也可以理解为从声明到释放的之间的时间。变量具体可以分为全局变量、静态全局变量、静态局部变量和局部变量。按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。 总的分为局部变量和全局变量:局部变量又可分为动态局部变量(没特殊声明的变量一般都为动态局部变量)和静态局部变量(用static关键字声明的变量如:static int a;);两者的区别在于:静态的局部变量生存期比动态的局部变量来的长,动态的局部变量的生存期为所定义的范围内,如在函数内定义的,函数结束,变量也跟着结束,变量的值不会保存下来。而静态变量的生存期为整个源程序(也可说是一个文件,不同环境不同称呼)。而两者的作用域是一样。只能在定义他的函数内起作用,离开了这个函数就不起作用了。全局变量:在函数之外定义的变量称为全局变量。全局变量可以为本文件中其他函所共用(作用域),它的有效范围(生存期)从定义变量开始到文件结束。如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即全局变量不起作用。下面来看一个例子:#include"stdio.h"int d=1; //声明一个全局变量int fun(int p) { static int d=5; //定义一个静态局部变量d初值为5 //第二次调用时没有执行此行d=d+p; //此时局部变量d的值为9,(第一次调用)//第二次调用是局部变量d 的值为13,因为上一次执行完后d的值为9,printf("%d",d); //第一次输出为9,//第二次输出13}void main(){ int a=3; d=d+a; //此时d的值为4;a变量的值为3,全局变量d的值为1。for(i=0;i<2;i++) fun(d); //此处的d值为4,传送给形参p,再一次调用时还是将4传给开参p printf("d=%d",d); //输出d的值为4.此处的d为全局变量。} 看以上内容时,你先把程序看一篇,然后把会值代进去远算,每一次看注释时在同一行中只要看到第二个”//“时结束.第2个“//”为第二次调用时看的。以上内容有一点乱,但是希望可以帮助到你...88有什么不明白可以再问!答案补充 看程序时注释行不要选先看。本程序一共调用fun函数两次,两次实参的值都为4.

变量的存储类别题库共25页word资料

第七章变量的存储类别 一、选择题 1.有以下程序 #include int a=2; int f(int n) static int a=3; int t=0; if(n%2) static int a=4; t += a++; else static int a=5; t += a++; return t+a++; void main() int s=a, i; for( i=0; i<3; i++) s+=f(i); printf("%d\n", s); 程序运行后的输出结果是______。 A)26 B)28 C)29 D)24 答案: C 2. 凡是函数中未指定存储类别的局部变量,其默认的存储类别是。

A) auto B) register C) extern D) static 答案:A 3. 以下不正确的说法是。 A)在不同的函数中可以使用名称相同的变量 B)在函数内定义的变量只在本函数范围内有效 C)形式参数是局部变量 D)在函数内的复合语句中定义的变量在本函数范围内有效 答案:D 4. 在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。 A) auto B) register C) extern D) static 答案:D 5.如果在一个函数中的复合语句中定义了一个变量,则以下说法正确的是。 A)在本函数范围内有效 B)在本程序范围内有效 C)只在复合语句中有效 D)非法变量 答案:C 6. 下列变量定义错误的是。 A) int x,y; B) register static int a,b,c;

符号表简介

符号表简介 符号表的作用:连接声明与引用的桥梁,记住每个符号的相关信息,如作用域和绑定等,帮助编译的各个阶段正确有效地工作。 对符号表设计的基本要求:目标是合理存放信息和快速准确查找。 1.正确存储各类信息。 2.适应不同阶段的需求; 3.便于有效地进行查找、插入、删除和修改等操作; 4.空间可以动态扩充; 4.3.1 符号表条目 每个声明的名字在符号表中占据一栏,称为条目,用于存放名字的相关信息。 符号表中的内容:保留字、标识符、特殊符号(包括算符、分隔符等)等等。不同类别的符号存放在不同的子表中,如变量名表、过程名表、保留字表等。 存放方式:关键字+属性。 例:下述符号的关键字应是,名字+类型,称为组合关键字: int x; struct x { float y, z; }; 为C构造的符号表中,组合关键字至少应该包括三项:名字+作用域+类型。 当一个名字x在同一作用域中允许有多于一个的声明,则对x的引用时需要根据上下文确定x到底属于哪个对象。因此有些程序设计语言在语法上规定了不允许这样的声明,以简化编译时的处理。 4.3.2构成名字的字符串的存储 定长数据与变长数据,直接存放与间接存放。 名字(直接存储)名字(间接存储)属性 sort 101 proc, ... a 106 int, ... readarray 108 proc, ... 118 boolean, ... draw_a_red_line_for_o bject_a sort#a#readarray#draw_a_red_line_for_object_a # ↑100

间接存储的方法实际上解决了复杂信息的存储问题,将其推广到属性,则任何一个复杂的属性,均可以为其另辟空间(空间本身可以是复杂结构,如数组的内情向量等),而仅需要将指向此空间的指针放在此属性在符号表中的对应位置即可。 4.3.3 名字的作用域 程序设计语言的名字可以出现在不同的范围内,并且可以具有不同的意义。 两种划分范围的方式:并列的和嵌套的。 不同的语言采用不同的方式:如Pascal的过程定义可以是嵌套的,而C的过程定义是并列的,但是C允许程序块是嵌套的。 名字的作用域:名字在哪个范围内起作用。并列的两个范围内的名字作用域互不相干,但是分别在嵌套的两个范围内的名字,其作用域的问题就需要制定规则来限定,以使得任何一个名字在任何范围内涵义都是无二义的。 名字的作用域规则:规定一个名字在什么样的范围内应该表示什么意义。 <1> 静态作用域原则(static-scope rule):编译时就可以确定名字的作用域,也可以说,仅 从静态读程序就可确定名字的作用域。 <2> 最近嵌套原则(most closely nested):以程序块为例,也适用于过程。 ①程序块B中声明的作用域包括B; ②如果名字x不在B中声明,那么B中x的出现是在外围程序块B'的x声明的作用域中, 使得 (a) B'有x的声明,并且 (b) B'比其它任何含x声明的程序块更接近被嵌套的B。 ## 通俗地讲,名字的声明在离其最近的内层起作用,即在名字引用处从内向外看,它处在所遇到的第一个该名字声明的作用域。 4.3.4 线性表 为了正确反映名字的作用域,线性表应具有栈的性质,即符号的加入和删除,均在线性表的一端进行。 表4.2 线性表的符号表组织

单片机数据存储类型和申明方法

.51 的存储器结构 笼统来说单片机片内存储器分为CODE区和data区,cpu从code区读取指令,对data 区的数据进行运算处理。前者在程序运行中为只读,一般为FLASH,用来放置程序代码和一些只读的数据(如字模表之类),后者可以随机读写,用来存放程序运行中的临时数据,如局部变量或全局变量,全局变量一直占用着RAM内存,而局部变量在使用完后会自动清除RAM空间。当然在片外,可以外扩FLASH和RA(此时称为XRAM因为寻址方式不一样),外扩的大小与单片机寻址能力有关。有的单片机将外扩RAM封装在片内,如AT89C51所以有了所谓的片内XRAM。 .变量的存储模式 变量是一种在程序执行过程中能不断变化的量。它有数据类型、存储类型、存储器模式和有效范围四种属性。C语言规定每个变量必须有一个标识符作为变量名,在使用一个变量前,必须先对变量进行定义,指出其数据类型和存储模式。以便编译系统为其分配存储单元。在C51中对变量进行定义的格式如下: [ 存储类型] 数据类型[ 存储器类型] 变量名表, 如auto char data i; 存储类型指明变量的存储区域,而变量的存储类型和变量在程序中说明的位置决定了它的作用范围。存储类型含义与C语言相同。存储类型有四种:auto型、extern 型、static 型、register 型,缺省为auto型(看来我一直都是凹凸型啊)。其区别如下: auto:自动变量。存储在内存的堆栈区,属于临时性存储变量,并不长期占用内存,可以被多次覆盖。 register:寄存器变量。register与auto一样属于自动类别。区别在于register 的值保存在CPU 的寄存器中。计算机中只有寄存器中的数据才能直接参与运算,而一般变量是放在内存中的,变量参加运算是,需要先把变量从内存中取到寄存器中,然后计算。所以一般把使用最频繁的变量定义成register变量。register变 量只能在函数中定义,并只能是int和char型。 static:静态变量。声明静态变量的,也就是C语言中的私有成员?如果在一个函数中声明一个静态变量,静态变量的空间不在栈里面,而是存储在静态空间里,这个函数结束后,静态变量的值依旧存在,内存不会收会此变量占用的内存空间,而是等整个程序都结果后才收回静态 变量空间。 extern:外部类型。extern用来声明外部变量,可以用于此程序外的程序中(可在两个C 文件间交叉使用),类型要一致。变量在数据运行时被分配了一定的内存空间,该空间在整个运行程序中,只要程序存在,自始自终都被该变量使用,即其值始终不变。 数据类型就不用多说了,bit ,byte,char 什么的。 存储器类型与单片机的寻址方式有关,影响程序的执行效率。下表是传统 C51 的存储器类型,不同单片机类型有所差别。

相关文档