关于C语言的static 又涨姿势了
最近学习一段代码,关于求平均值过滤的,过去使用时,一般是这样算,先一下子读出10个值来,求和再除以10,然后返回平均值。
今天学到了一种新的求平均值法,不用一下子读出10个来,而是正常读,只不过是以前读的都会记录保存下来,然后通过移位来更新这10个数据,
简单来说 如果 采集的数据为(2.0,2.1,2.5,2.3,2.5,2.2,2.5,2.6,5.9,2.7),那么下次采集为 2.5,那么就会将2.0丢掉,2.1为第一位,依次移位实现数据的更新。感觉巧妙之级。
这种方法的代码实现如下‘
/*******************************************************************************
* Function Name : static int _filter(int m)
* Description :
* Input :
* Output : None
* Return :
* Attention : None
*******************************************************************************/
static int _filter(int m)
{
static int flag_first = 0, _buff[10], sum;
const int _buff_max = 10;
int i;
if(flag_first == 0)
{
flag_first = 1;
for(i = 0, sum = 0; i < _buff_max; i++)
{
_buff[i] = m;
sum += _buff[i];
}
return m;
}
else
{
sum -= _buff[0];
for(i = 0; i < (_buff_max - 1); i++)
{
_buff[i] = _buff[i + 1];
}
_buff[9] = m;
sum += _buff[9];
i = sum / 10.0;
return i;
}
}
一开始以为 else 后边的不会执行,后来我错了。
static有一个特点
特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.
示例程序一
#include <iostream>
using namespace std;
void staticLocalVar()
{
static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化工作
cout<<"a="<<a<<endl;
++a;
}
int main()
{
staticLocalVar(); // 第一次调用, 输出a=0
staticLocalVar(); // 第二次调用, 记忆了第一次退出时的值, 输出a=1
return 0;
}