静态全局变量在初始化的时候只初始化一次,接着它就不在初始化了,这是怎么实现的那,我们通过反汇编代码来看看。
#include<stdio.h>
int fun(int a1)
{
static int a=a1;
static int b=10;
a++;
return a;
}
void main()
{
int a1,a;
for(a1=10;a1>0;a1--)
{
a=fun(a1);
printf("%d ",a);
}
int fun(int a1)
{
static int a=a1;
static int b=10;
a++;
return a;
}
void main()
{
int a1,a;
for(a1=10;a1>0;a1--)
{
a=fun(a1);
printf("%d ",a);
}
}
static int a=a1;
0082355E mov eax,dword ptr [$S1 (827164h)]
00823563 and eax,1
00823566 jne fun+3Dh (82357Dh)
00823568 mov eax,dword ptr [$S1 (827164h)]
0082356D or eax,1
00823570 mov dword ptr [$S1 (827164h)],eax
00823575 mov eax,dword ptr [a1]
00823578 mov dword ptr [a (827168h)],eax
5: static int b=10;
0082355E mov eax,dword ptr [$S1 (827164h)]
00823563 and eax,1
00823566 jne fun+3Dh (82357Dh)
00823568 mov eax,dword ptr [$S1 (827164h)]
0082356D or eax,1
00823570 mov dword ptr [$S1 (827164h)],eax
00823575 mov eax,dword ptr [a1]
00823578 mov dword ptr [a (827168h)],eax
5: static int b=10;
我们来看反汇编,在反汇编里面很清晰的表达出了对于这个静态量的过程。
就好像在静态量上面有个判断标志如果是0的话,就给他赋值,若不是的话,直接跳过并不给他赋值。
再观察b的表现,我们发现,没有任何汇编语句对应,为什么会这样那?
因为在执行次行的时候,编译器发现b后面是以个常量,就直接把它写进了全局变量里面。