Tre*_*ree 2 c variables static minimum retain
我想写一个函数minimum来返回在调用之间发送给它的最小值.该函数可以接收任意数量的参数,所有参数都是0到100范围内的整数.发送给函数的参数列表的结尾用-1表示.
例如,如果我输入以下呼叫main:
minimum (90,78,5,20,-1);
minimum (70,40,2,-1);
minimum(40,30,-1);
Run Code Online (Sandbox Code Playgroud)
第一个呼叫将返回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;
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下输出:
In Call Two: min is 2
In Call Three: min is 30
Run Code Online (Sandbox Code Playgroud)
输出应该是:
In Call Two: min is 2
In Call Three: min is 2
Run Code Online (Sandbox Code Playgroud)
虽然我已经min使用static关键字声明了变量,min但似乎不会在调用之间保留其值.
为什么以及如何min在函数调用之间保留其值?
静态变量确实在调用之间保留它们的值.但是,请允许我将您的注意力转移到代码中的几行:
cur_min = va_arg(lst,int);
min = cur_min;
Run Code Online (Sandbox Code Playgroud)
您在进入该功能后立即执行此操作.所以,虽然min 会有最后一次传球的值,但你会在每次传球时都覆盖它.