static修饰一个局部变量时 生命周期变了,作用域没变?

static修饰一个局部变量时 生命周期变了,作用域有没有改变?#import <Foundation/Foundation.h>

void test(){
int a = 0;
a++;
static int b = 0;
b++;
printf("a:%d b:%d\n",a,b);
}

int main(){
test();
test();
return 0;
}
调用两次test函数 结果a没变   b却变了。
 
 
 
已邀请:

大大Hui

赞同来自: 岳麓山下

首先,a 是一个局部变量,局部变量在默认下时自动变量;b是一个被static修饰的局部变量,是一个静态变量。
自动变量在函数调用时进行,每调用一次函数重新赋一次初值。 而静态变量只赋一次初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。所以结果a 不会变,b会变.

Eysolitude

赞同来自: 李珊

静态局部变量与自动局部变量作用域相同,但生命周期变长,下面实际说明
1   static  int b;
2   int b;
第一种和第二种他们在c语言里面分配的存储空间是不同的
第一种  变量b的数据放在数据段,生命周期存在于整个源程序
第二种 变量b的数据存放在栈里面,生命周期从使用它到使用完毕,即被释放
 
还有一种情况需要注意
如果用static修饰一个全局变量时,生命周期不会改变,同样存在于整个源程序,直到整个程序结束
但是作用域变小
全局变量作用域为整个源程序,即各个源文件
静态全局变量作用域为所在的源文件

Meonardo

赞同来自:

函数的大括号里面的变量也是局部变量,你调用了2次a的值是多少还是多少.
static 修饰的变量b 和 变量a 在内存存放的地址不一样 老师讲过(static修饰的变量 在main之前已经初始化,在main中得 static int var 不在执行;) 这里相当于他是个全局变量.

要回复问题请先登录注册