C语言中静态局部变量的问题

#include<stdio.h>
int main()
{
int t,n,i,str[4];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int sum=0;
while(n--)
{
int item=0;
scanf("%d%d%d%d",&str[1],&str[2],&str[3],&str[4]);
if(str[1]<60||str[2]<60||str[3]<60||str[4]<60)
item=1;

sum+=item;
}

printf("%d\n",sum);

}

return 0;
}

将其中的item的定义改为static int item;然后输入几组数据后 累加就会出错(多加了)
例如输入1(回车)4(回车)88 88 88 55(回车)88 88 88 59(回车)88 88 88 88(回车)88 55 88 88(回车) 到这里就会输出一个值 没有用static定义的输出的值是3 用static定义的输出的值是4 求解释喔

静态局部变量相当于全局变量(只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的),函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值(也就是说,如果item是static的,那么只有在第一次进入这个函数的时候会执行item=0,以后都不会执行。)。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-09
因为static的生命周期是要等到整个程序运行完才释放的,而且当他被赋值一次时,在定义的地方是不会再重新给他赋值的。。。所以当你输入的第一次88 88 88 55 有一个小于60 时 item 就被赋值为1了,之后不管你输入的是88 88 88 88 还是 99 99 99 99 之类的。。他都是 1 。
修改的方法是用以下的方法让item重新赋值(如下):
static int item;
item = 0 ;

又或者可以不用sum
直接写成:
if(str[1]<60||str[2]<60||str[3]<60||str[4]<60)
item++;
}
printf("%d\n",item); // 注意:要把static int item 写到while 循环的外面,不然这句会出错
第2个回答  2014-03-07
static 用修饰符来声明的变量叫静态变量。
这种变量和一般的变量不同。从程序开始到程序结束一直存在。
局部静态变量。是在函数内部声明的静态变量。
局部静态变量的值有一个特性,它会保存你操作的结果。
举个例子:
int test(int a)
{
static int sum = 5;
sum += a;
return sum;
}
当你第一次调用时 static int sum = 5;起作用
int a1 = test(2);// a1 = 7 同时 sum = 7
当你第二次调用时 static int sum = 5;不起作用 sum = 7
int a2 = test(2);// a2 = 9 sum = 9

这是因为用static声明的变量分配的地址不是在栈中。在完成第一次调用后,它仍然存在,并且有个值。第二次调用时,并不会再重新生成一个变量,还会使用上一次函数完成时的值。
第3个回答  2015-09-12
静态局部变量相当于全局变量,只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的,函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值。
第4个回答  2014-03-07
在函数内部static声明的变量,在第一次调用函数的时候进行初始化,此后对此函数的调用,都使用第一次初始化话时的变量,对函数内部来说就像是使用全局变量一样,但静态局部变量只对声明的函数可见。一般编写底层应用的时候用的比较多
相似回答