-
php中在变量和函数前加static关键字之后的区别
2017-05-06 18:29:53php中在变量和函数前加static关键字之后的区别上课时老师提到在变量和函数前加上static的作用,今天来总结 一下:一、函数内的static变量static静态变量的理解 静态变量 类型说明符是static。 静态变量属于静态存储...php中在变量和函数前加static关键字之后的区别
上课时老师提到在变量和函数前加上static的作用,今天来总结
一下:一、函数内的static变量
static静态变量的理解 静态变量 类型说明符是static。 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。 另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。 静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。 静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
<?php function fun1(){ $count = 0; $count ++; echo $count; } for($i=0; $i<10; $i++){ fun1(); } ?>
输出:1111111111
<?php function fun1(){ static $count = 0; $count ++; echo $count; } for($i=0; $i<10; $i++){ fun1(); } ?>
输出:12345678910
<?php function fun1(){ $count = 0; $count ++; echo $count; } $count = 2; echo $count; echo "\n"; for($i=0; $i<10; $i++){ fun1(); } ?>
输出:2 1111111111 分析:函数内的$count是一个局部变量
二.静态方法
static全局变量和普通全局变量,static局部变量和普通局部变量,static函数与普通函数的区别?下面本文将一一为你解答。 (1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 (2)从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 (3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
看下面代码
test.php
<?php require "test1.php"; function funa(){ echo "Hello World!!!"; } ?> ?>
test1.php
<?php function funb(){ funa(); } funb(); ?>
执行test.php得到结果
Hello World!!!php默认函数是public,故其作用域是整个源程序,导致test1.php也能执行funa()
最后:
引用了http://www.phpernote.com/php-template-framework/625.html
http://blog.csdn.net/u014033518/article/details/46931781 -
关于static关键字在函数名前使用解析
2018-06-23 09:14:50关于函数名前加static的一些解释说法一:在函数的返回类型前加上关键字static,函数就被定义成为静态函数。函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。定义...关于函数名前加static的一些解释
说法一:
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
c语言中static的语义1.static变量:1).局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
2.static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
说法二:
在C里面,所谓 static ,只是限制在当前源文件————这个只是对于编译器/链接器而言。但实际上,运行时,static和普通的extern 的函数/变 量,没有区别。
例如:
static int8u i2c_read_char(i2c_bus_t *i2c, int32u pos)
{
int32u c = 0;
i2c_set_address(i2c, pos);
I2CMasterSlaveAddrSet(i2c->base, i2c->device_address >> 1, true);
HWREG(i2c->base + I2C_O_MCS) = I2C_MASTER_CMD_SINGLE_RECEIVE;
while(I2CMasterBusy(i2c->base))
{}
c = I2CMasterDataGet(i2c->base);
return (int8u)(c);
} -
static关键字说明
2019-07-27 08:29:18局部变量在每次函数条用的时候分配内存空间,在函数调用结束之后销毁; 全局变量在程序开始运行时分配空间,在程序结束时销毁; 如果有全局变量和局部变量重名,局部变量会暂时覆盖全局变量; 全局变量只能用常量...生存周期相关
- 局部变量在每次函数条用的时候分配内存空间,在函数调用结束之后销毁;
- 全局变量在程序开始运行时分配空间,在程序结束时销毁;
- 如果有全局变量和局部变量重名,局部变量会暂时覆盖全局变量;
- 全局变量只能用常量表达式初始化,因为程序开始时要用适当的值来初始化全局变量。
static关键字在C语言中作用
1、针对变量加static关键字
使用static修饰***全局***变量,在全局变量前加static,全局变量就被定义成为一个全局静态变量,其特点如下:
- 存储区 静态存储区没有改变(静态存储区在整个程序运行期间都存在);
- 初始化 未经初始化的全局静态变量会被程序自动初始化为0;
- 作用域 全局静态变量在声明它的文件(就是所在的.c文件)外是不可见的,就是从定义开始要该文件结束。非静态的全局变量的作用域是整个源程序;而静态全局变量则限制了其作用域,即只能在定义该变量的源文件内有效,在同一个源程序的其他c文件不能使用,这样做的优点:1、不会被其他文件所访问,修改 ** 2、其他文件可以使用相同名字的变量,不会发生冲突。**
使用static修饰***局部***变量,在局部变量前加static,局部变量就被定义成为一个局部静态变量,其特点如下:
- 存储区(内存中的位置):由栈变为静态存储区,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函数后,尽管该变量还继续存在,但不能使用它;
- 初始化:为静态局部变量赋初值是在编译时进行的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用函数重新给一次值,相对于执行一次赋值语句。如果在定义局部变量是不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初值,则它的值是不确定的值。这是由于每次函数调用结束后存储单元已被释放,下次调用时又重新分配存储单元,而所分配的单元中的值是不确定的。
- 作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束,尽管该变量还继续存在,但不能使用它。
2、针对函数加static关键字
- 在函数的返回类型前加上关键字static,函数就被定义为静态函数。
- 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。只能被所在文件中的函数调用,而不能被同一个程序中的其他文件的函数调用。使用static修饰函数的好处:1、其他文件中可以定义相同名字的函数,不会发生冲突;2、静态函数不能被其他文件使用。
3、加static关键字的全局变量与普通全局变量的区别
- 全局变量的定义之前加static就构成了静态的全局变量
- 全局变量的存储在静态存储区,静态全局变量也一样,存储位置没有区别
- 非静态的全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量可以再说明为外部变量(加extern关键字),被其他源文件使用,非静态的全局变量在各个源文件中都是有效地;
- 静态变量限制了其作用域,即只能在定义该变量的源文件中有效,不能被再被说明为外部变量,在同一源程序的其他源文件不能使用,可以避免在其他源文件中引起错误。
- static全局变量只初始化 一次,防止在其他文件单元中被引用。
4、加static关键字的局部变量与普通局部变量的区别
- 存储区由栈区变成静态存储区,生存周期变了,
5、加static关键字的函数与普通函数的区别
- 作用域不同
-
【C++】内联函数
2019-10-02 09:18:14在函数说明前加关键字“inline”,该函数就被声明为内联函数。又称内置函数。每当程序中出现对该函数的调用时,C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参,以便在程序运行时不再...内联函数是什么?
在函数说明前加关键字“inline”,该函数就被声明为内联函数。又称内置函数。每当程序中出现对该函数的调用时,C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参,以便在程序运行时不再进行函数调用。(编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率)
#include<iostream> using namesapce std; inline int func(int a, int b, int c); int main() { int i,j,k,result; cin>>i>>j>>k; result = func(i,j,k); cout<<"i+j+k="<<result<<endl; return 0; } inline int func(int a, int b ,int c) { return a+b+c; }
为什么要使用内联函数?
为了消除函数调用时的系统开销,提高运行速度;
当程序在调用函数时,系统要将程序当前的一些状态信息,比如现场和返回地址等存到栈中,同时转到函数的代码处去执行函数体语句,这些参数保存与传递的过程中需要时间和空间的开销,使得程序执行效率低特别是在程序频繁地调用函数时,这个问题会更严重内联函数的使用
- 内联函数在第一次调用之前必须进行完整的定义,否则编译器将无法知道应该插入什么代码
- 在内联函数体内一般不能含有复杂的控制语句,例如循环、递归等
- 内联函数是一种空间换时间的措施,若内联函数较长,且调用太频繁时,程序将加长很多。如果将一个复杂函数定义为内联函数反而会增大开销,这种情况下,多数编译器会自动将其转换普通函数来处理;所以一般只有规模比较小且使用频繁的函数才定义为内联函数
- inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到
- 内联函数与宏定义有些相似,但是宏定义是在编译前由预编译对其进行预处理的,它只作简单的字符置换而不进行语法检查
例:
/*#define 和 inline*/ #include<iostream> #define D(x) x*2; using namespace std; int main() { cout<< D(2) << endl; cout<< D(2+3) <<endl; //会出错 return 0; }
#include<iostream> inline int D(int x); using namespace std; int main() { cout<< D(2) << endl; cout<< D(2+3) <<endl; return 0; } inline int D(int x) { return x*2; }
-
c++虚函数和纯虚函数的几点说明
2018-06-16 09:49:52在类的成员函数定义前加 virtual 关键字,该函数将被作为虚函数。虚函数被继承后仍为虚函数。虚函数的在子类中可以被override(覆盖)、overload (重载 ) virtual string toString(){ } 纯虚函数 纯虚函数除了有... -
C++关键字 extern
2020-10-15 13:36:38对于函数而言,和引用变量是一样的,如果需要调用其他.c文件中的函数,在文件中的函数声明前加extern即可,不加extern而直接声明函数也可以,因为声明全局函数默认前面带有extern。 如果不想让其他.c文件引用本文件... -
c++11/14新特性解读之二 explicit关键字
2020-06-22 20:34:48对于多个参数的明确的构造函数-在构造函数前加explicit关键字 首先举例说明explicit关键字的用法: 未加explict: struct Complex { int real, ima; Complex(int re,int im=0):real(re),ima(im) { cout <<... -
C语言extern关键字用法和理解
2021-02-24 15:14:57对于函数而言,和引用变量是一样的,如果需要调用其他.c文件中的函数,在文件中的函数声明前加extern即可,不加extern而直接声明函数也可以,因为声明全局函数默认前面带有extern。详见下文34.如果不想让其他.c文件... -
C++static关键字变量的存储位置
2020-04-30 00:03:38C++的static有两种:面向过程...在全局变量前,加static,该变量被定义为一个静态全局变量 特点: 该变量在全局数据区分配内存 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被... -
c++虚函数和虚函数表
2020-02-27 16:53:10(2)虚函数是在基类普通函数前加virtual关键字,是实现多态的基础 (3)虚函数表其实不用我们管这个编译器会帮我们做好 注:无特别说明本文的虚表均指虚函数表 (一) 什么是虚函数表? 虚函数(Virtual Function)... -
C++ 虚函数
2013-10-21 14:13:56在类成员函数前加关键字virtual,则该函数为虚函数。 虚函数的使用格式; class A { public: virtual void show(); } 说明; 1,当在派生类中定义了一个同名的成员函数时,只要该函数的参数个数... -
4.6-4.7虚析构函数、纯虚函数和抽象类的介绍
2019-09-12 21:31:23虚析构函数:在析构函数前加关键字virtual进行说明。 目的:使用delete运算符删除一个对象时,能保证析构函数被正确地执行。 格式: class<类名> { virtual <类型><函数名>(<参数表>)=0; ... -
类模板、函数模板以及类成员函数在类外定义情况
2016-08-03 21:09:49说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class 可以包含基本数据类型可以包含类类型。 请看以下程序: [cpp] view ... -
Essential C++学习记录&笔记整理37(在派生类中定义一个虚函数)
2020-05-23 16:59:10也就是说,当我们在派生类中,为了覆盖基类的某个虚函数而进行同名函数的声明时,可以不加关键字virtual,编译器会根据两个同名函数的原型声明,自动决定派生类的某个同名函数是否会覆盖其基类中的同名函数 ... -
作用域的一些说明,static关键词
2016-07-07 18:27:00作用域的一些说明 ...如果我们需要在函数内部使用这个全局变量,这时我们就需要在函数内部,这个全局变量前加关键字global. PHP static 关键词 通常,当函数完成/执行后,会删除所有变量。不过,有时... -
学习笔记(03):5天Python闯关训练营-104期-Python函数哪里不一样
2021-01-06 23:54:537、可通过列表代替输入多个数字,在列表前加*即可 8、关键字参数与可变参数(均可传入0个或多个参数)的区别:关键字参数的参数带参数名(可通过字典); 9、 kw可理解为可选项; 10、 11、 不会报错; 12、... -
DLL函数查看器V3.5
2013-07-24 10:10:3711.在线查询接口可在注册表如下位置修改,{searchTerms}为保留关键字被作为替换函数名. [HKEY_CURRENT_USER\Software\ViewApiList] "WebSearch"="http://www.baidu.com/s?wd={searchTerms}&ie=utf-8" 12.是否仅反... -
2.7、C++友元的使用
2019-09-11 10:13:572.7、C++友元的使用 友元有友元函数和友元类。...在类体内说明,在函数的类型说明符前加关键字friend; 在类体外定义,定义格式与普通函数相同; 友元函数不是成员函数; 友元函数可以直接访问类体内的私有成... -
javascript函数的解释
2011-02-26 11:03:5247.当在超链接中调用JS函数时用:(javascript:)来开头后面加函数名 48.在老的浏览器中不执行此JS:<!-- //--> 49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"></script> 50.指定在不支持脚本的... -
ORACLE数据库sql语言 、函数及常用命令
2018-10-08 12:25:38Create table as 经常在修改一个表前备份该表,而且运行速度很快且不用提交 例如:Select table a_student as select * from student; Create table as 还可以用来复制表结构 例如:假设有三个表 -
C++ primer之第七章(类 3)
2018-03-12 09:10:49inline关键字必须与函数定义放在一起才能使函数成为内联,仅将inline方在函数声明前不起任何作用。所以inline函数在类体内定义的话直接加inline。如果在类体内声明,在类外定义,在类外定义出必须加inline关键字,... -
matlab参数传递及全局变量
2014-04-15 16:13:55若要将变量定义为全局变量,则应当对变量进行说明,即在该变量前加关键字global。 Matlab的全局变量使用: 在函数最开头都加上以下一句 global 变量; 使这个变量变成全局变量。 一般来说全局变量均用... -
c++ primer第五版第十五章答案
2018-12-18 22:38:00虚成员是基类希望派生类进行覆盖的函数,在其成员前加关键字virtual,使得该成员可以实现动态绑定。 15.02 protected访问说明符与private有何区别? private成员:即使是基类的派生类也无法直接访问。 protected... -
到底什么样的对象可以出现在头文件中
2012-04-19 10:01:35首先,我说的不一定完全正确,如果错误,那么,请大家一定要指正,不要有什么顾忌,尽管指正我的错误 在头文件中出现的一般是声明而不是定义...我们可以用extern关键字来声明一个变量或函数,函数名前加不加extern关键 -
C++ Primer(第五版)|练习题答案与解析(第十五章:面向对象程序设计)
2020-02-28 20:51:17C++ Primer(第五版)|练习题答案与解析(第十五章:面向对象程序设计) ...虚成员是基类希望派生类进行覆盖的函数,在其成员前加关键字virtual,使得该成员可以实现动态绑定。 练习题15.2 protected访问说明符... -
extern使用方法总结
2014-03-04 11:08:12在c语言中,修饰符extern用在变量或者函数的声明前,用来...(函数和全局变量本质上没有区别,函数名时指向函数二进制块开头处的指针,而全局变量时在函数外部声明的变量,函数名也是在函数外,因此函数也是全局的) -
C++友元与操作符重载
2018-07-05 01:01:09可以让它只有前两种性质通过将一个函数声明为友元可以使它只具有第一种性质友元函数:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend... -
C语言学习之变量存储
2012-04-05 00:04:57C语言中对变量的说明包括两方面的内容:变量类型以及变量的存储类型。...关键字auto加在变量名及其类型前,用来说明它是自动变量。局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进 行说明, 当