在本文中,我们将详细介绍php中的static静态变量的各个方面,并为您提供关于php静态变量的作用的相关解答,同时,我们也将为您带来关于C#学习日记20----static静态变量与常量、C++st
在本文中,我们将详细介绍php中的static静态变量的各个方面,并为您提供关于php静态变量的作用的相关解答,同时,我们也将为您带来关于C#学习日记20----static静态变量 与 常量、C++ static静态变量(无师自通)、C语言 static静态变量、C语言 static静态变量的作用的有用知识。
本文目录一览:- php中的static静态变量(php静态变量的作用)
- C#学习日记20----static静态变量 与 常量
- C++ static静态变量(无师自通)
- C语言 static静态变量
- C语言 static静态变量的作用
php中的static静态变量(php静态变量的作用)
@H_301_0@今天碰到了一个PHP的小试题,一直没有明白为什么第三次循环是static静态变量没有起作用呢?想了好久才明白原理。
<div>
PHP
class MyClass{
function add($b){
static $a=1;
$a+=$b;
return $a;
}
}
$class = new MyClass();
for($i=0;$i<=5;$i++){
$c=$class->add($i);
}
echo($c);
/*<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>中的变量作用范围的另<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>重要特性就是静态变量(static 变量)。
静态变量仅在局部<a href="https://www.jb51.cc/tag/hanshu/" target="_blank">函数</a>域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。*/
分析:
$i = 0;
$i<=5;(true)
$i++ =1;
$c=$class->add(0);
$b = 0;
static $a=1;
$a+=$b = 1+0;
$c=1;
第二次循环:
$i = 1;
$i<=5;(true)
$i++ =2;
$c=$class->add(1);
$b=1;
$a = 1;
$a+=b = 1+1;
$c=2;
第三次循环:
$i = 2;
$i<=5;(true)
$i++ =3;
$c=$class->add(2);
$b=2;
$a = 2;
$a+=b = 4;
$c=4;
第四次循环:
$i = 3;
$i<=5;(true)
$i++ =4;
$c=$class->add(3);
$b=3;
$a = 4;
$a+=b = 4+3;
$c=7;
第五次循环:
$i = 4;
$i<=5;(true)
$i++ =5;
$c=$class->add(4);
$b=4;
$a = 7;
$a+=b = 7+4;
$c=11;
第六次循环:
$i = 5;
$i<=5;(true)
$i++ =6;
$c=$class->add(5);
$b=5;
$a = 11;
$a+=b = 11+5;
$c=16;</span></span></pre>
C#学习日记20----static静态变量 与 常量
在上一篇 委托(delegate)类型 中我定义public方法的时候使用了 static 关键字,导致后来无法通过 对象.方法名 的形式访问此方法,这一篇我们就具体学习下 static 静态变量。
变量:
在学习static静态变量之前,我们还是有必要来了解 变量 的意义。程序要对数据进行读、写、运算等操作,当需要保存特定的值或结果的时候就需要用到变量,在用户看来,变量是用来描述一条信息的名称,在变量中可以储存各种类型的信息,比如:人的姓名、车票的价格等等;在计算机看来,变量代表存储地址,变量是什么类型,变量中存储的数值就是什么类型。使用变量的一条重要原则就是 :变量必须先定义后使用。
在C# 中变量的定义与使用规则与C/C++类似,这里就不多说了,(所以学好C还是挺重要的^_^)
static静态变量:
带有 static 修饰符声明的变量称为静态变量,一旦静态变量所属的类被装载直到包含该类的程序运行结束时他将一直存在。static 的主要性质有两个:
1.隐藏:
在类里定义的静态方法或静态变量,属于类本身,而不属于那个类的一个对象。要想调用一个被定义为static的方法,必须在它前面加上这个类的名称。(即时是public访问修饰也不行,这也是上一篇末尾的原因) 实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员,也可以使用类的静态成员。
访问规则:
静态方法只能访问类的静态成员,不能访问类的非静态成员;
非静态方法可以访问类的静态成员,也可以访问类的非静态成员;
静态方法不能使用实例来调用,只能使用类名来调用。
比如下面的例子:
class person { public static int i; //定义一个静态变量i 默认值是0 public int k=0; //定义一个非静态变量 k; public static int sbu() // 定义一个静态方法 { i = 9; //成功对静态变量赋值 k = 5; //出错了,无法访问非静态变量 return k; //综上静态方法只能访问静态变量 } public int Add() //定义一个实例方法 { i = 9; //对静态变量赋值没有问题 k = 5; //对非静态变量赋值也没问题 return i; //综上实例方法能够访问所有类型变量 } }
我们实例化一个person一个对象对方法进行访问:
static void Main(string[] args) { person per = new person(); //实例化一个对象per int i = per.i; //出错了,per访问不了类里的静态变量 int k = per.k; //没有问题 per.sbu(); //出错了,per访问不了静态方法 person.sbu(); //成功调用 per.Add(); //成功调用 person.Add(); //出错了,person访问不了实例方法 }
2.保持变量内容的持久:
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
写个例子就知道了(这次我用C++写了)C#不允许在方法中使用static:
#include<iostream> using namespace std; int main() { for (int i=0;i<4;i++) { static int k =0; //定义一个静态变量并赋值为0 k++; cout<<k<<endl; //输出 } return 0; }
结果:
如果上面的代码中我们去掉 static 此时k=0;变成了非静态变量,结果只会出现一个数字 1;
常量:
常量就是其质固定不变的量,从数据类型来看常量的类型可以是任意一种值类型或引用类型。一个常量的声明就是声明程序中要用到的常量名称和他的值。(用法也与C类似)但是在C#中常量一旦定义无法在改变它的值
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace demo { class Program { const int S = 9; // 定义一个常量S并赋值 static void Main(string[] args) { S += 4; //出错了,常量一旦定义就不能改变常量的值 Console.WriteLine(S); } } }
以上就是 C#学习日记20----static静态变量 与 常量的内容。
C++ static静态变量(无师自通)
虽然函数在程序中可以被多次调用,但是存储在函数局部变量中的值并不会持久存在,这是因为局部变量在函数终止时即被销毁,然后在函数再次被调用时又会被重新创建。下面的程序说明了这种变化:#include <iostream> using namespace std; void showLocal(); //Function prototype int main() { showLocal(); showLocal(); return 0; } void showLocal() { int localNum = 5; // Local variable cout << "localNum is " << localNum << endl; localNum = 99; }程序输出结果:
localNum is 5
localNum is 5
然而,有时候需要让程序“记住”在函数调用之间的局部变量中存储了什么值,这可以通过使变量成为静态变量来实现。当函数返回时,静态局部变量不会被销毁,它们存在于程序的整个一生中,尽管它们的作用域只是在定义它们的函数中。
下面的程序使用了静态局部变量来计算调用函数的次数:
#include <iostream> using namespace std; void showStatic(); // Function prototype int main() { // Call the showStatic function five times for (int count = 0; count < 5; count++) showStatic(); return 0; } void showStatic() { static int numCalls = 0; // Static local variable cout << "This function has been called " << ++numCalls << " times." << endl; }程序输出结果:
This function has been called 1 times.
This function has been called 2 times.
This function has been called 3 times.
This function has been called 4 times.
This function has been called 5 times.
有人可能会认为每次调用 showStatic 函数时,numCalls 将被重新初始化为 0,但是不会发生这种情况,因为只有在创建该变量时才会初始化一个变量,而在程序运行期间静态变量只创建一次。如果没有初始化 numCalls,那么它将自动初始化为 0,因为和全局变量一样,如果程序员没有初始化数字静态局部变量,则它们将自动初始化为 0。
C语言 static静态变量
静态变量类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直
占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束。静态变量虽在程序的整个执行过程中始终存在,
但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,
或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,
是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
一、静态局部变量:
1、 Static类内部变量是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,它不管其所在的函数是否被调用,都将一直存在;
不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,
Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。
而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);
静态变量的初始值为0。
4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,
因此仍以采用局部静态变量为宜。
注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。
二、静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于:
1、非静态全局变量的作用域是整个源程序 ,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件(即声明(extern)了该变量的CPP文件,或包含该变量声明头文件的CPP文件)中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。
关于Static关键字
1.静态变量,分配在静态存储区,在数据段中。函数退出之后,变量值不变。
2.作用域,全局的静态变量、静态函数只能在本文件中使用。(不同于一般全局变量)
局部的静态变量同函数的局部变量
注意点:
1)、static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),
这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)、static静态变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。——有信息隐蔽的作用。
(外部的 Static声明亦可用于声明函数。如果将函数声明为Static类型,则该函数名除了对该函数声明所在的文件可见外,其他文件均无法访问。
--static修饰函数一般放在.c或者.cpp文件中,.h文件一般用于对外提供接口 )
3)、若全局变量仅在单个C文件中访问,则可将此变量改为静态全局变量,以降低模块间的耦合度;
若全局变量仅由单个函数访问,则可将此变量改为该函数的静态局部变量,以降低模块间的耦合度。
4)、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题。
所谓"可重入"(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。
函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。
如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。
当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为局部变量,则返回为错指针。
C语言 static静态变量的作用
C语言 static静态变量的作用

- 静态变量通过关键字 static 进行声明,该变量存储在数据段上,也就是内存上,可以改变变量的作用域和生命周期。
- 对于局部变量作用域依旧没有改变,只有定义该局部变量的函数和复合语句可以引用,但是其生命周期变成了直到整个源程序文件结束。
- 对于全局变量生命周期没有发生变化,但是其作用域反而有所减小,只有本文件的函数可以引用该全局变量。
- 针对static的特性,只有本文件内的函数可以引用该变量,在C语言中一个源程序文件就是一个模块,一个源程序文件(模块)声明了一个static全局变量之后其他模块只能通过该模块提供的接口函数来访问这个static变量,而不能直接实现对其进行操作,也就是说static可以实现一个模块的封装。
范例:
建立一个链表文件公司工资文件,tax.c:
- #include<stdio.h>
-
- static int base = 10000; //基本的工资基数
-
- int chicken_legs(float i){
- return (1 + i)*base;
- }
建立一个向外界提供一个接口函数声明,tax.h:
- extern int chicken_legs(float i);
如其他源文件user.c需要引用该文件,使用接口文件:
- #include<stdio.h>
- #include"tax.h"
-
- int main(void){
- int wage;
- float increase;
- wage = chicken_legs(increase);
- return 0;
- }
user.c这个文件就不能修改tax.c中的用static声明的 base,而只能引用接口函数,static 关键字使文件中的全局变量的范围局限于该文件中,从而起到一个封装文件的作用
我们今天的关于php中的static静态变量和php静态变量的作用的分享就到这里,谢谢您的阅读,如果想了解更多关于C#学习日记20----static静态变量 与 常量、C++ static静态变量(无师自通)、C语言 static静态变量、C语言 static静态变量的作用的相关信息,可以在本站进行搜索。
本文标签: