static问题

#include <stdio.h>
int fun()
{ static int x=1;
x*2; return x;
}
main()
{int i,s=1,
for(i=1;i<=2;i++) s=fun();
printf("%d\n",s);

程序运行后的输出结果是
A)O
B)1
C)4
D)8
答案是C。
请详细分析一下static这个函数。
有可能的话,也分析一下另外3个储存方式。

如果照这个程序运行,结果应该是B吧,
int fun()
{ static int x=1;
x*2; /* 这里是不是落了一个“=”啊?x*=2; */
return x;
}

如果加上等号,那么就是C。

x定义成静态变量,编译时分配空间并且赋初值。函数多次调用时,会保留上次调用的值不变。
第一次调用时,x=x*2,变成了2;第二次调用,x不会重新赋值,而是保持2不变,所以2*2=4。

一、auto
auto称为自动变量。局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进行说明, 当auto省略时,默认为是局部变量。局部变量在函数调用时自动产生,但不会自动初始化, 随函数调用的结束,这个变量也就自动消失了,下次调用此函数时再自动产生,还要再赋值,退出时又自动消失。
所以如果fun函数中的x没有用static说明(默认为auto变量),那么这个题答案就是2。
二、static
static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
1. 静态局部变量
它与局部变量的区别在于,在函数退出时,这个变量始终存在,但不能被其它函数使用。当再次进入该函数时,将保存上次的结果。其它与局部变量一样。
2. 静态全局变量
静态全局变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全局变量的区别是,全局变量可以再说明为外部变量(extern),被其它源文件使用,而静态全程变量却不能再被说明为外部的,即只能被所在的源文件使用。
三、extern
extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外,还要被其它文件使用。因此,必须将全程变量通知每一个程序模块文件,此时可用extern来说明。
四、register
register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中,而不是象普通的变量那样存储在内存中,这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个,编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。因此,寄存器变量常用在同一变量名频繁出现的地方。另外,寄存器变量只适用于局部变量和函数的形式参数,它属于auto型变量。因此,不能用作全程变量。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-13
static不是函数,而表示变量是静态变量。数据存储在静态区,效果是该变量x是可以全局调用,不会像函数局部变量那样,当函数结束时就销毁而是一直保存。第一次x=1;x=x*2时x=2;
因为循环会执行两次,因此x的值为2×2=4
第2个回答  2011-03-13
一、静态全局变量有以下特点:
该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
二、在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
相似回答