我想写一个函数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#include 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 但我得到以下输出:
In Call Two: min is 2 In Call Three: min is 30输出应该是:
In Call Two: min is 2 In Call Three: min is 2虽然我已经
min
使用static
关键字声明了变量,min
但似乎不会在调用之间保留其值.为什么以及如何
min
在函数调用之间保留其值?
1> David Hoelze..:静态变量确实在调用之间保留它们的值.但是,请允许我将您的注意力转移到代码中的几行:
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);`应该做的伎俩.
你所指的不是初始化.您只需设置其当前值.初始化设置其初始值.