0
#include <stdio.h>

void func() {
   static int x = 0;  // x is initialized only once across three calls of
                      //     func()
   printf("%d\n", x); // outputs the value of x
   x = x + 1;
}

int main(int argc, char * const argv[]) {
   func(); // prints 0
   func(); // prints 1
   func(); // prints 2

   // Here I want to reinitialize x value to 0, how to do that ? <-- this line
   return 0;
}

上記のコードでは、func() を 3 回呼び出した後、ゼロに再初期化したいと考えてxいます。0 に再初期化する方法はありますか?

4

3 に答える 3

2

関数を 3 回呼び出した後、常にカウンターをリセットしますか? または、呼び出し元に任意の時点でカウントをリセットさせたいですか?

前者の場合は、次のようにできます。

void func() {
  static int x = 0;
  printf("%d\n", x);
  x = (x + 1) % 3;
}

後者の場合、ローカル静的変数を使用するのはおそらく悪い選択です。代わりに次のデザインを使用できます。

class Func
{
  int x;
  // disable copying

public:
  Func() : x(0) {}

  void operator() {
    printf("%d\n", x);
    x = x + 1;
  }

  void reset() {
    x = 0;
  }
};

Func func;

2 つのオブジェクトが 2 つの異なるカウンターを増加させないようにコピー不可にする (またはシングルトンにする) か、カウンターを静的メンバーにして、すべてのオブジェクトが同じカウンターをインクリメントするようにする必要があります。これで、次のように使用できます。

int main(int argc, char * const argv[]) {
  func(); // prints 0
  func(); // prints 1
  func(); // prints 2

  func.reset();
  return 0;
}
于 2012-10-29T08:06:24.843 に答える
1

func()変数のアドレスを、外部から見えるポインタに割り当てることができますfunc()

func()または、変数をリセットするように指示するために渡すことができる特別なパラメーターを持つことができます。

しかし、実際には、x内部で宣言することの全体的なポイントはfunc()、の本体内でのみ表示できるようにすることですfunc()。変更できるようにしたい場合はx、別の場所で定義してください。あなたはC++を書いているのでx、あるクラスの静的メンバーであることがおそらく理にかなっています。

于 2012-10-29T07:24:40.917 に答える
0

できません。これは外部では見えないローカルの静的変数ですfunc()

次のいずれかを使用できます。

  1. グローバル静的 (一般的には推奨されません)。
  2. 参照/ポインター パラメーターを介して渡すか、参照によって返します。
于 2012-10-29T07:18:44.423 に答える