关于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;
}

static.jpg

sitemap