-
C语言序列3——全局变量和局部变量,标识符作用域、变量的生存期
2020-06-16 11:29:40#include <stdio.h> const int A = 10; int a = 20; static int b = 30; int c; int main(void) { static int a = 40;...作用域(Scope)这个概念适用于所有标识符,而不仅仅是变量,C语言的作用域.#include <stdio.h> const int A = 10; int a = 20; static int b = 30; int c; int main(void) { static int a = 40; char b[] = "Hello world"; register int c = 50; printf("Hello world %d\n", c); return 0; }
作用域(Scope)这个概念适用于所有标识符,而不仅仅是变量,C语言的作用域分为以下几类:
函数作用域(Function Scope),标识符在整个函数中都有效。只有语句标号属于函数作用域。标号在函数中不需要先声明后使用,在前面用一个
goto
语句也可以跳转到后面的某个标号,但仅限于同一个函数之中。文件作用域(File Scope),标识符从它声明的位置开始直到这个程序文件的末尾都有效。例如上例中
main
函数外面的A
、a
、b
、c
,还有main
也算,printf
其实是在stdio.h
中声明的,被包含到这个程序文件中了,所以也算文件作用域的。块作用域(Block Scope),标识符位于一对{}括号中(函数体或语句块),从它声明的位置开始到右}括号之间有效。例如上例中
main
函数里的a
、b
、c
。此外,函数定义中的形参也算块作用域的,从声明的位置开始到函数末尾之间有效。标识符的链接属性(Linkage)
外部链接(External Linkage),如果最终的可执行文件由多个程序文件链接而成,一个标识符在任意程序文件中即使声明多次也都代表同一个变量或函数,则这个标识符具有External Linkage。具有External Linkage的标识符编译后在符号表中是
GLOBAL
的符号。例如上例中main
函数外面的a
和c
,main
和printf
也算。内部链接(Internal Linkage),内部链接常指一个程序文件中全局变量,可以被程序文件内各个子程序访问,这在编译过程中处理,和link阶段不发生关系。如果变量前加了static,那么它永远不会被外部程序访问,它不会被编译程序写入目标代码的链接区。例如上例中
main
函数外面的b
。如果有另一个foo.c
程序和main.c
链接在一起,在foo.c
中也声明一个static int b;
,则那个b
和这个b
不代表同一个变量。具有Internal Linkage的标识符编译后在符号表中是LOCAL
的符号,但main
函数里面那个a
不能算Internal Linkage的,因为即使在同一个程序文件中,在不同的函数中声明多次,也不代表同一个变量。无链接(No Linkage)。除以上情况之外的标识符都属于No Linkage的,例如函数的局部变量,以及不表示变量和函数的其它标识符。
存储类修饰符(Storage Class Specifier)有以下几种关键字,可以修饰变量或函数声明:
static
,用它修饰的变量的存储空间是静态分配的,用它修饰的文件作用域的变量或函数具有Internal Linkage。register
,编译器对于用register
修饰的变量会尽可能分配一个专门的寄存器来存储,但如果实在分配不开寄存器,编译器就把它当auto
变量处理了,register
不能修饰文件作用域的变量。现在一般编译器的优化都做得很好了,它自己会想办法有效地利用CPU的寄存器,所以现在register
关键字也用得比较少了extern
,上面讲过,链接属性是根据一个标识符多次声明时是不是代表同一个变量或函数来分类的,extern
关键字就用于多次声明同一个标识符,下一章再详细介绍它的用法typedef
,在“sizeof运算符与typedef类型声明”一节讲过这个关键字,它并不是用来修饰变量的,而是定义一个类型名。在那一节也讲过,看typedef
声明怎么看呢,首先去掉typedef
把它看成变量声明,看这个变量是什么类型的,那么typedef
就定义了一个什么类型,也就是说,typedef
在语法结构中出现的位置和是面几个关键字一样,也是修饰变量定义的,所以从语法(而不是语义)的角度把它和前面几个关键字归类到一起变量的生存期(Storage Duration,或者Lifetime)分为以下几类
静态生存期(Static Storage Duration),具有外部(GLOBAL)或内部(LOCAL)链接属性,或者被
static
修饰的变量,在程序开始执行时分配和初始化一次,此后便一直存在直到程序结束。这种变量通常位于.rodata
,.data
或.bss
段,例如上例中main
函数外的A
,a
,b
,c
,以及main
函数里的a
自动生存期(Automatic Storage Duration),链接属性为无链接并且没有被
static
修饰的变量,这种变量在进入块作用域时在栈上或寄存器中分配,在退出块作用域时释放。例如上例中main
函数里的b
和c。
动态分配生存期(Allocated Storage Duration),以后会讲到调用
malloc
函数在进程的堆空间中分配内存,调用free
函数可以释放这种存储空间全局变量
定义在所有函数外部的变量称之为全局变量。全局变量可以在任意地方使用。
局部变量
定义在函数内部的变量称之为局部变量。局部变量只能在所定义的函数函数内部中使用。
静态变量
静态变量的存放地址,在整个程序运行期间都不发生改变。全局变量都是静态变量,用'static'修饰的局部变量也是静态变量。未初始化的静态变量将被编译器初始化为0.
标识符的作用域
标识符:变量名、函数名、类型名统称为标识符。标识符起作用的范围称之为标识符的作用域。
单文件的程序中,结构、函数和全局变量的作用域是其定义所在的整个文件。
函数形参的作用域是整个函数。
局部变量的作用域,是所在的语句块,即{............}中的内容。
同名标识符的作用域,可能一个被另一个包含。则在小的作用域中,作用域大的那个标识符被屏蔽,不起作用。
变量的生存期
全局变量(静态变量)的生存期,从程序开始到整个程序的结束。
静态局部变量的的生存期,从定义它语句的第一次执行开始,到整个程序的结束。
函数形参的生存期,从函数执行开始,到函数返回时结束。
非静态局部变量的生存期,从执行到定义它的语句开始,一旦执行到其作用于外,生存期便终止。
-
静态成员函数 全局变量 局部变量 标识符 结构体 函数模板
2018-01-16 16:35:37函数指针刚好相反,子类的函数指针可以指向父类,但是父类的函数指针不能指向子类。 在创建派生类对象时,构造函数的执行顺序:基类构造函数、对象成员构造函数、派生类本身构造函数。 静态成员函数...对象指针的指向原则是:小-->大,父类指向子类。
函数指针刚好相反,子类的函数指针可以指向父类,但是父类的函数指针不能指向子类。
在创建派生类对象时,构造函数的执行顺序:基类构造函数、对象成员构造函数、派生类本身构造函数。
静态成员函数不含this指针。
静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。
类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数
在创建派生类对象时,构造函数的执行顺序:基类构造函数、对象成员构造函数、派生类本身构造函数。
局部变量:局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
全局变量:全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
静态局部变量:静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
静态全局变量:静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
标识符:函数名、数据名等都是标识符。标识符可以由字母、下划线、数字组成,必须以字母或下划线开头。关键字不能作为标识符。数组表示:
结构体:
struct 结构体类型名 { 成员类型 成员名; };
指针结构体指针变量只有初始化后才可以使用。
函数模板:
template <类型形式参数表> 返回类型 函数名(形式参数表) { 函数体; }
-
Java变量跟标识符的概念
2017-10-25 16:50:41在方法、构造方法或者语句块中定义的变量成为局部变量;变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。 类变量 静态变量,只属于类 类变量也声明在类中,方法体之外,但必须声明为static类型。 ...1. Java变量
局部变量
定义在方法体内的变量,其生命周期只在方法内。
在方法、构造方法或者语句块中定义的变量成为局部变量;变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。类变量
静态变量,只属于类
类变量也声明在类中,方法体之外,但必须声明为static类型。成员变量
非静态变量,属于类的某个实例对象
成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候被实例化。成员变量可以被类中的方法、构造方法和特定的语句块访问。
2.标识符
在JAVA的组成部分中包括了对包、类、方法、变量等的起名,这些名字是要有一定的规则的。
- 标识符可以包含数字、字母、$、_,但是不能以数字开头
- 关键字不能用作标识符
- 标识符是大小写敏感的
-
java中变量与标识符介绍
2020-05-01 17:09:23**变量:**可变的量,从计算机的角度解释变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。...局部变量:方法或语句块内部定义的变量 成员变量:方法外部、类的内部定义的变量 标识符: Ja...变量: 可变的量,从计算机的角度解释变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。根据所存储的数据类型不同,有各种不同类型的变量,变量名代表这块内存中的数据。
变量分类:
1、按所属数据类型划分:
基本数据类型(8种)变量和引用数据类型变量(类、接口、数组)2、按被声明的位置划分:
局部变量:方法或语句块内部定义的变量
成员变量:方法外部、类的内部定义的变量标识符: Java对包、类、方法、参数和变量等要素命名时使用的字符序列
标识符命名规则:
1、由字母、数字、下划线(_)、美元符号($)组成
2、不能以数字开头
3、区分大小写
4、不能是java中的关键字和保留关键字(java中关键字和保留关键字
)
5、长度无限制标识符命名习惯: 通常驼峰命名法、见名知意、以单词或单词组合来命名。
-
Java变量和标识符
2017-10-26 00:32:53Java变量局部变量定义在方法体内的变量,其生命周期只在方法内。 在方法、构造方法或者语句块中定义的变量成为局部变量;变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。类变量静态变量,只属于类 ... -
Java基础之变量与标识符
2019-03-22 18:54:10package Stringlei; /* ...*@version Create time : 2019年3月22日下午5:07:41 *说明: 放在方法外 类里面 的变量 是成员变量 * 放在方法里面的是局部变量 */ public class Bianliang { int a = 20;//成员... -
进制的转换易错点、成员变量和局部变量的区别、标识符
2020-07-16 20:10:170152 1101010——十六进制 0110 1010 结果为0x6a 成员变量和局部变量 局部变量:在使用之前必须先赋值 成员变量:在创建对象时,分配内存存放类的数据,初始化有默认值 byte,short,int,long 默认为0; float 默认0.0... -
程序中不要出现标识符完全相同的局部变量和全局变量
2019-09-24 06:55:28程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的 作用域不同而不会发生语法错误,但会使人误解。 1 #include <iostream> 2 3 const int MAX=5; 4 /* run this program using the... -
JAVA 入门基础—— 变量(成员变量、局部变量)、标识符、运算符、定义类、定义方法、数据类型、数组、方法...
2018-08-09 16:06:291.变量 概述:就是一个容器,用于存储数据的 语法: 1.声明的同时直接赋值 数据类型 变量名 = 值; String name = "我是程序员"; 2.先声明后赋值 声明: 数据类型 变量名; String... -
java基础第二讲——java语法、变量、标识符规则
2015-07-28 18:19:44按照声明位置划分:局部变量、全局变量 按照引用类型划分: 基本数据类型变量 (被声明在语句块,方法体内) 数值型数据:整数类型(byte,short,int,long)浮点类型(float,double)字符型(char)布尔... -
Java基础学习笔记 -- 3(变量、标识符、关键字)
2015-05-06 14:04:141. 变量 变量就是指代在内存中开辟的存储空间,用于存放运算... 其中 a 和 b 就是变量(具体来说是局部变量)。 变量的声明: 使用Java语法声明一个变量,让运行环境为其分配空间; int num; int a,b,c; 变量的命名... -
Postman接口自动化测试之-参数化(三大内值全局变量:标识符ID、时间戳和随机数)
2019-10-16 17:41:25根据接口测试工作中的使用场景,Postman的变量分为:环境变量、全局变量、局部变量。例如不同测试环境:测试地址、准生产地址、线上地址等;所以测试工程需要在多种测试地址间进行切换,如果每一个环境都用单独建... -
KKB:变量概述(局部变量、成员变量)、数据类型、标识符、类型转换
2020-11-20 19:05:28局部变量:方法或语句块内部定义的变量(比如:main方法里定义的变量) 成员变量:方法外部、类的内部定义的变量(比如:定义在main方法之外,class类内的变量) 注意:类的外面不能有变量的声明 二、数据... -
java变量和java标识符的区别
2018-07-14 17:22:00在方法、构造方法或者语句块中定义的变量成为局部变量;变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。 类变量 静态变量,只属于类 类变量也声明在类中,方法体之外,但必须声明为static类型。... -
C++中的全局变量、普通局部变量和静态局部变量的区别
2016-04-06 00:52:00在C++中,我们经常难以说清楚全局变量、局部变量和静态局部变量的区别。本博客从变量存储特性和标识符作用域两个角度区分这三个变量。 首先,我们来看看C++程序的内存区域是如何分配的。 从上图,我们可以看到,... -
标识符命名规则 || 形参和实参 || 全局变量和局部变量的区别 || C语言中关键字 || for循环次数的控制
2017-09-17 11:35:32就是给类,接口,方法,变量等起名字的字符序列 组成规则 英文大小写字母数字$和_ 注意事项 不能以数字开头标识符必须是由字母下划线开头的字母下划线数字组合 2.以下不正确的说法是:C 语言规定()。 ... -
关于为函数形参赋值和搜索变量标识符的云云
2018-04-06 16:18:00为形参提供默认值是以前的一种流行方法: function foo(a){ a=a||1; console.log(a);...另:最好不要修改形参,参见竟然修改形参有这么可怕的后果。...形参本身是局部变量,只能在函数内访问: functio... -
成员变量和局部变量的区别
2014-06-18 09:48:52局部变量的一般形式如下 [变量修饰符] 变量类型 变量名; 变量修饰符可以是final,表示这是常量。 变量类型可以是Java中任意合法的基本类型或复合类型。 变量名是用户自定义标识符,遵循标识符的... -
局部变量与成员变量的区别
2013-05-04 22:48:00局部变量的一般形式如下 [变量修饰符] 变量类型 变量名; 变量修饰符可以是final,表示这是常量。 变量类型可以是Java中任意合法的基本类型或复合类型。 变量名是用户自定义标识符,遵循标识符的一般规则。 可以... -
C#的标识符,关键字,常量,变量
2020-07-26 10:34:17关键字:对编译器有特殊作用的标识符 常量和变量其实是一个容器,存储数据的容器 常量: const 数据类型 常量表达式 eg: const double Pi=3.14159; 一定要进行初始化,初始化后不能再次赋值 标识符首字母需要大写 ... -
Java成员变量、类变量、局部变量的区别
2021-02-02 21:27:092.变量名必须是合法的标识符,变量的命名也应该要规范 3.变量声明是一条完整的语句,因此每一个声明都必须以分号结束 1.类变量、实例变量、局部变量区分 先来看一段代码 public class Variable { static int ... -
基本语法 :标识符,关键字, 修饰符,数据类型,数组,内存空间堆栈,类变量,实列变量,局部变量,⽅法⼊参...
2019-12-18 20:23:41Java程序的标识符和关键字 java核⼼基础知识之修饰符和使⽤场景 Java核⼼基础之数据类型 java核⼼基础之数组 Java内存空间堆栈讲解 Java核⼼基础之变量类型 java⽅法⼊参和返回类型讲解 java核⼼基础之常⻅... -
局部变量和成员变量的区别
2010-03-11 19:38:00局部变量的一般形式如下[变量修饰符] 变量类型 变量名;变量修饰符可以是final,表示这是常量。变量类型可以是Java中任意合法的基本类型或复合类型。变量名是用户自定义标识符,遵循标识符的一般规则。可以在一行中... -
SQL局部变量
2017-02-24 16:16:311.局部变量的定义: DECLARE 局部变量名 数据类型 【后面可以用逗号连接n个】 局部变量名必须是以@开头,要符合标识符的命名规则。 2.局部变量的赋值: 用SET或SELECT语句为局部变量赋值。 SET 局部变量名=表达式 ... -
Day02——Java基础——eclipse的安装与使用、关键字、标识符、常量、变量、局部变量、全局变量、基本数据...
2020-01-11 09:12:35Java开发工具的安装与使用 Eclipse开源免费的java开发工具 功能强大 安装分为两个版本: 1、安装版(需安装好jdk后才能进安装) 使用安装文件安装安装提示进行安装 (1)选择安装版本->java企业级开发 (2... -
java基础之——局部变量和成员变量的区别?
2014-04-28 13:06:37局部变量:声明在方法的参数中,或方法内部的变量。 局部变量是用户自定义的标识符,遵循标识符的一般规则: (1)可以在一行中定义多个局部变量,以逗号分隔; -
堆变量,栈变量,局部变量,全局变量
2018-04-10 20:05:55全局、静态、new产生的变量都在堆中,动态分配的变量在堆中分配,局部变量在栈里面分配。函数中声明的变量在栈中,用了new标识符在堆中,全局变量和static变量在全局区。程序为栈变量分配动态内存,在程序结束为栈... -
标识符、关键字、 变量的概念与数据类型
2019-11-28 17:56:31局部变量的存储方式: 字符型字面值: 布尔类型字面值: 字符串字面值: 转义字符: 标识符、关键字和数据类型的字面值 标识符 1)不能数字开头。标识符可以有字母、数字、下划线(_)和美元符($)组成... -
ECMA中的标识符、变量声明
2014-06-09 12:12:391)、所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一或多个字符: 口第一个字符必须是一个字母、下划线〔_)或一个美元符号($) 口其他字符可以是字母、... -
成员变量和局部变量
2017-03-29 17:33:55在Java语言中,根据定义变量位置的不同。...不管是成员变量,还是局部变量,都应该遵守相同的命名规则:从语法角度来看,只要是一个合法的标识符即可,但从程序可读角度来看,应该是多个有意义的单词连缀而
-
【PyCharm中文教程 05】通过指定参数,执行程序
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
3月4日第一天创立专栏
-
呆逼萌新的小程序。。。。。
-
github中个人资料的更新验证
-
SpringBoot + Dubbo + zookeeper Demo
-
Golang: 关于时间字符串转time.Time
-
【布道者】Linux极速入门
-
2021年保育员(中级)考试及保育员(中级)考试题库
-
电动客车电池管理器系统功能策略设计方案7.pdf
-
Mosquitto PHP 插件安装使用及中文手册
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
PPT大神之路高清教程
-
MySQL 事务和锁
-
python基本算法合集(16)——打印菱形
-
IS62WV51216ALL_datasheet.pdf
-
【众拳STM8 46 讲】I2C 串形总线工作原理
-
使用vue搭建微信H5公众号项目