【问题标题】:Static variable that does not retain its value不保留其值的静态变量
【发布时间】:2017-06-08 04:00:44
【问题描述】:

我想编写一个函数 minimum 来返回在两次调用之间发送给它的最小值。该函数可以接收任意数量的参数,所有参数都是 0 到 100 范围内的整数。发送给函数的参数列表的末尾用 -1 表示。

例如,如果我在main 中输入了以下调用:

minimum (90,78,5,20,-1);
minimum (70,40,2,-1);
minimum(40,30,-1);

第一次调用将返回 5,因为 90,78,5,20 的最小值是 5。 第二次调用将返回 2,因为 5,70,40,2 的最小值是 2 第三次调用将返回 2,因为 2,40,30 的最小值是 2。

因此,函数minimum 返回迄今为止发生的所有调用中发送给它的最小数字。

所以我创建了一个名为min 的静态变量来保留函数调用之间的最小值。

这是我得到的:

#include <stdio.h>
#include <stdarg.h>

int minimum(int cnt, ...)
{
   static int min;
   int cur_min,i;
   va_list lst;

   va_start(lst,cnt);
   cur_min = va_arg(lst,int);
   min = cur_min;

 printf("min is %d and cur min is %d \n", min, cur_min);
    for(i=0; i<cnt; i++)
    {
        if(cur_min != -1)
        {
            if(cur_min < min)
            {
                min = cur_min;
            }
           cur_min = va_arg(lst,int);
           printf("min is %d and cur min is %d \n" , min, cur_min); 
       }
       else
           break;

    }

      va_end(lst);

    return min;

   }





int main()
{





  printf("In Call One: min is %d \n",minimum(90,78,5,20,-1));
  printf("In Call Two: min is %d \n", minimum(70,40,2,-1) );
  printf("In Call Three: min is %d \n", minimum(40,30,-1) );


    return 0;
}

但我得到以下输出:

In Call Two: min is 2 
In Call Three: min is 30 

虽然输出应该是:

In Call Two: min is 2
In Call Three: min is 2

看起来虽然我已经使用 static 关键字声明了变量 min,但 min 在两次调用之间并没有保留其值。

为什么以及如何使min 在函数调用之间保持其值?

【问题讨论】:

  • 请考虑正确格式化您的代码,并删除那些无用的空行。

标签: c variables static minimum retain


【解决方案1】:

静态变量在调用之间会保留它们的值。但是,请允许我将您的注意力引向代码中的几行:

cur_min = va_arg(lst,int);
min = cur_min;

您在输入函数后立即执行此操作。因此,虽然min 已经获得了上一次传递的值,但您将在 每个 传递中覆盖它。

【讨论】:

  • 你能详细解释一下吗?如果我理解得很好,那么 cur_min = va_arg(lst,int); min = cur_min;只会执行一次 - 在进入 for 循环之前。为什么会覆盖一些东西?这不是初始化吗?我理解静态变量保留它们的值,但在我的情况下,它似乎没有,因为如果是这样,它将在下一次调用(即调用三)中具有值 2。谢谢!
  • 在 for 循环之前只执行一次。但每次调用函数时都会执行一次。这就是为什么您要覆盖 min 的先前值
  • 如果我理解得很好,那么由于 min 是一个静态变量,它只被初始化一次。如果是这样,那为什么行 cur_min = va_arg(lst,int); min = cur_min;每次调用函数时都执行? min 不应该只在第一次调用函数时初始化吗?谢谢
  • min = cur_min; 没有初始化变量。初始化在您首次声明变量时完成,无论是隐式为零 (static int min;) 还是显式 (static int min = 3;)。写min = cur_min; 只是将变量设置为cur_min 的值,而不是初始化它。不是 100% 肯定,但写 static int min = va_arg(lst,int); 应该可以解决问题。
  • 你指的不是初始化。您只是设置其当前值。初始化是设置它的初始值。
猜你喜欢
  • 2018-06-23
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多