0

例如,如果我编写一个"add"使用 int"a"并产生一个值的ftn 调用a + bb则该值是由最后一次调用产生的。例如

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)

编辑:即使不使用“静态”

4

6 回答 6

4

为什么没有静态?这正是你所需要的,不是吗?否则,您可以将参数作为指针传递并在您想要的任何位置进行更改。

void f( int * a )
{
    *a += 5;
}

和主要的,或者你打电话的任何地方

int a = 0;
f( &a );
f( &a );

a将是 10,您也可以在函数中使用它。

这有帮助吗?

于 2013-06-15T05:25:02.667 回答
2

这会做你想要的吗?

int add(int a) {
  static int b = 0;
  return b += a;
}

静态变量badd()函数的本地变量,但在调用之间保持其值。

于 2013-06-15T04:37:41.237 回答
1

考虑:

#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 表明该值已被记住。如果您不相信,请调整每个调用的次数并自己尝试。

于 2013-06-15T05:30:03.717 回答
1

如果您需要维护状态,但不希望函数将其存储在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;
}
于 2013-06-15T05:30:22.707 回答
1

静态局部变量怎么样?

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
于 2013-06-15T04:37:39.203 回答
1
#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;
}
于 2013-06-15T08:21:32.243 回答