将函数参数分配给C中的本地静态变量,并在递归中保留第一个值

时间:2018-03-10 19:50:31

标签: c recursion static constants

我在尝试定义本地静态变量时遇到此错误。

  

Initializer元素不是常量。

我想在此递归中保留var的第一个值。怎么通过这个? 希望您也澄清将参数分配给要防止的本地静态变量的副作用。

int function(int var)
{
static int index=var;
//some code ...
    return var==0?1:function(var-1);
}

2 个答案:

答案 0 :(得分:2)

在函数开始之前初始化static变量。它就像一个全局变量,只有函数范围。编译器不能使用它还不知道的值。

您可以使用帮助器布尔值解决此问题:

int function(int var)
{
  static int index_is_set=0;
  static int index;
  if (!index_is_set)
  {
    index = var;
    index_is_set = 1;
  }

//some code ...
    return var==0?1:function(var-1);
}

所以第一次输入它设置值的函数时,将布尔标志设置为1,这样就不会被其他调用覆盖。

请注意,这对于构造来说不是很有用,因为如果要在程序中第二次递归调用函数(在我第一次获得结果之后),就没有办法重置变量(除非你使index_is_set全局,所以你可以从外面重置它。)

请注意,通过将起始值用作额外参数,可以完全删除所有这些static内容。

int function(int var, int start_value)
{
    // ...
    return var==0 ? 1 : function(var-1,start_value);
}

第一个电话就像:

function(20,20);

或包含在隐藏此实现的函数中:

int function_wrapper(int var)
{
    return function(var,var);
}

在所有调用中传递起始值。消耗更多的自动变量空间,但更清洁,没有记忆效应&更容易调试。

答案 1 :(得分:2)

案例:

static

是一个带初始化程序的声明(参见 ISO / IEC 9899:2011§6.7声明)。该语句声明一个int function(int first_var, int var) { //some code ... return var==0?1:function(first_var, var-1); } ... function(5, 5); //First call 变量初始化为一个值,该值必须是在编译时定义的常量。简单来说,因为在执行开始之前初始化了值,必须在函数使用之前定义初始值设定项。

如果你想以你使用的方式保留递归的第一个值不是一个好的选择,原因有很多:

  • 无法使用非常数值
  • 分配值
  • 如果有效,下次进入该功能时,将重新分配清除第一个值
  • 本地静态变量具有无限生命,但范围仅限于本地函数。然后,您无法从外部作用域访问或初始化它。

一个解决方案可以是向函数2变量传递第一个值,并且该函数的第一次调用传递相同的值:

int function(int var)
{
static int index;    //Declaration
index=var;           //Assignement
//some code ...
    return var==0?1:function(var-1);
}

为了完整起见,可以通过在静态变量的定义中破坏您的语句而不进行初始化(或使用通用初始化),然后执行赋值 ISO / IEC 9899:2011§6.5.16分配运营商):

UIView

但是因为它会在每次重新分配时重新分配,所以这只是一个很大的废话...