例如,如果我编写一个"add"
使用 int"a"
并产生一个值的ftn 调用a + b
,b
则该值是由最后一次调用产生的。例如
add(1) ==> 1 (first called b=0,then 1 + 0 = 1)
add(2) ==> 3 (second called b=1, then 2 + 1 = 3)
add(4) ==> 7 (third called b=3, then 3 + 4 =7)
编辑:即使不使用“静态”
例如,如果我编写一个"add"
使用 int"a"
并产生一个值的ftn 调用a + b
,b
则该值是由最后一次调用产生的。例如
add(1) ==> 1 (first called b=0,then 1 + 0 = 1)
add(2) ==> 3 (second called b=1, then 2 + 1 = 3)
add(4) ==> 7 (third called b=3, then 3 + 4 =7)
编辑:即使不使用“静态”
为什么没有静态?这正是你所需要的,不是吗?否则,您可以将参数作为指针传递并在您想要的任何位置进行更改。
void f( int * a )
{
*a += 5;
}
和主要的,或者你打电话的任何地方
int a = 0;
f( &a );
f( &a );
a
将是 10,您也可以在函数中使用它。
这有帮助吗?
这会做你想要的吗?
int add(int a) {
static int b = 0;
return b += a;
}
静态变量b
是add()
函数的本地变量,但在调用之间保持其值。
考虑:
#include <stdio.h>
int test1(){
static int localVar=0;
localVar++;
printf("test1 %i\n",localVar);
}
int test2(){
static int localVar=0;
localVar++;
printf("test2 %i\n",localVar);
}
int main(){
test1();
test2();
test1();
}
运行此打印
test1 1
test2 1
test1 2
因为静态适用于定义它的范围内的变量,在这种情况下,在 test1 和 test2 内部,都以 0 值开始,并且每次调用函数时都会递增,如您所见,即使在第一次调用test1,test2里面的值没有增加。再次调用 test1 表明该值已被记住。如果您不相信,请调整每个调用的次数并自己尝试。
如果您需要维护状态,但不希望函数将其存储在static
变量中,则选项有限。
您可以只传递状态,例如:
/* Be careful with the first call - the caller must initialise
previous_result to 0 */
int add(int a, int *prev_result)
{
int result = a + *prev_result;
*prev_result = result;
return result;
}
或者,您可以将其存储在文件中,例如:
/* Incomplete, and completely untested! */
int add(int a)
{
FILE *state_file;
int result
int prev_result;
state_file = fopen("state.txt", "r");
prev_result = get_value_from_file(state_file); /* write this yourself */
fclose(state_file);
result = a + prev_result;
state_file = fopen("state.txt", "w");
write_value_to_file(state_file, result); /* write this yourself */
fclose(state_file);
return result;
}
静态局部变量怎么样?
int add(int a)
{
static int b = 0;
b += a;
return b;
}
或者可能是一个 lambda:
int main(int,char**)
{
int b = 0;
auto add = [&](int a) { b += a; return b; };
std::cout << add(1) << "\n";
std::cout << add(2) << "\n";
std::cout << add(4) << "\n";
return 0;
}
输出:
1
3
7
#include <stdio.h>
int add(int value){
FILE *fp;
int pv = 0;
fp = fopen("temp.bin", "r+b");
if(fp==NULL){
fp = fopen("temp.bin", "wb+");
fwrite(&pv, sizeof(int), 1, fp);
rewind(fp);
}
fread(&pv, sizeof(int), 1, fp);
pv += value;
rewind(fp);
fwrite(&pv, sizeof(int), 1, fp);
fclose(fp);
return pv;
}
int main() {
printf("%d\n", add(1));
printf("%d\n", add(2));
printf("%d\n", add(4));
return 0;
}