13
#include<iostream>
using namespace std;

void callMe()
{
    int count=0;
    cout<<"I am called "<<++count<<" times!\n";
}

int main()
{
    callMe();
    callMe();
    callMe();
    callMe();
    return 0;
}

この場合、出力は次のようになります。

1回呼ばれました!
1回呼ばれました!
1回呼ばれました!
1回呼ばれました!

代わりに、出力を次のように印刷したい

1回呼ばれました!
2回呼ばれました!
3回呼ばれました!
4回呼ばれました!
4

9 に答える 9

41

次のコードスニペットで問題が解決することを願っています。

#include<iostream.h>

void callMe()
{
    static int count=0;
    cout << "I am called " << ++count << " times!\n";
}

int main()
{
    callMe();
    callMe();
    callMe();
    callMe();
    return 0;
}

ここで、静的変数はその値を保持し、毎回インクリメントされるカウントを出力します!

于 2012-11-26T10:15:49.987 に答える
24
void callMe()
{
    static int count = 0; // note 'static' keyword
    cout<<"I am called "<<++count<<" times!\n";
}
于 2012-11-26T10:15:50.207 に答える
11

実際には3つの方法がありますが、そのうちの2つはすでにここで言及されています。私は理由とともに要約します:

1)変数を静的として宣言します。

void callMe()
{
    static int count=0;
    cout<<"I am called "<<++count<<" times!\n";
}

これが機能するのは、関数が呼び出されるたびにカウントのコピーを作成し、関数の実行時にそれを削除するのではなく、メモリがカウントのコピーを1つ作成するようになったためです。また、ここで注目に値するのは、カウントがまだ関数に対してローカルであるということです。つまり、次のようなことを行おうとした場合です。

int main()
{
    int count;
    callMe();
    callMe();
    callMe();
    callMe();
    cout<<"you called "<<count<<"functions!\n";
    return 0;
}

関数のカウントとメインのカウントは2つの異なる場所にある2つの異なる変数であるため、countは引き続きガベージ値を表示します。

2)グローバル変数を初期化します。

int count=0; 
void callMe()
{
    cout<<"I am called "<<++count<<" times!\n";
}

上記の例では、変数のスコープはグローバルであるため、プログラム全体で変数の単一のコピーが使用されます。したがって、どこかで行われた変更は、プログラムのすべての場所に反映されます。3つ以上の機能を監視する必要がある場合は、このアプローチを使用できます。例:

int count=0;
void callMe()
{
    cout<<"I am called "<<++count<<" times!\n";
}

void callMe2()
{
    cout<<"I am called 2 "<<++count<<" times!\n";
}

int main()
{
    callMe();
    callMe();
    callMe2();
    callMe2();
    cout<<"you called "<<count<<" functions!\n";
    return 0;
}

ここでのカウントは基本的に関数とメインの両方に共通であるため、独自のローカルコピーを作成するのではなく、すべて同じ値を参照します。同じ名前の変数があると、混乱する可能性があります。グローバル変数と静的変数の違いとそのスコープを理解するには、ここをクリックしてください

3)変数の参照を渡します。

void callMe(int &count)
{
   cout<<"I am called "<<count++<<" times!\n";
}

void callMe2(int &count)
{
   cout<<"I am called 2 "<<++count<<" times!\n";
}

int main()
{
    int count=0;
    callMe(count);
    callMe(count);
    callMe2(count);
    callMe2(count);
    cout<<"you called "<<count<<" functions!\n";
    return 0;
}

これはおそらくこれを行うための最もクリーンな方法です。変数はメインに対してローカルであり(ガベージコレクションの複雑さを軽減します)、これは参照によるパスであるため、行われたすべての変更はメモリ内の同じ場所を指します。これに従わない確固たる理由がない場合は、これを使用すると思います。

私があなたをさらに混乱させないことを願っています、ハッピーハンティング。

于 2012-11-26T12:14:33.427 に答える
11

静的変数を作成します

したがって、関数自体で定義し、staticのプロパティにより、各呼び出しでその値を保持します。

void callMe()
{
    static int count=0;
    cout<<"I am called "<<++count<<" times!\n";
}

静的ストレージはデータセグメントで行われるため、関数スタックにはないため、各呼び出しで関数は変更された値を取得します。したがって、希望する結果が出力されます。

ただし、count宣言したのはローカルであり、スタックにストレージがあるため、関数呼び出しごとに常に必要です。count = 0

于 2012-11-26T10:17:18.133 に答える
6

引数として渡すか、関数の状態として保存する必要があります。

int count = 0;
auto callMe = [=] mutable {
    cout<<"I am called "<<++count<<" times!\n";
};
于 2012-11-26T10:37:42.547 に答える
3

カウントする前に「static」キーワードを使用する必要があります。

修正されたコードスニペットは次のようになります。 *

void callMe()
{
    static int count;
    cout<<"I am called "<<++count<<" times!\n";
}
于 2012-11-26T10:19:24.267 に答える
2

次のように関数が呼び出されるたびに、参照によって変数 count を渡し、それを増やすことができます。

void callMe(int &count)
  {
     cout<<"I am called "<<count++<<" times!\n";
  }

int main()
  {
    int count=0;
  callMe(count);
  callMe(count);
  callMe(count);
  callMe(count);
  return 0;
  }

参照渡しの詳細については、こちらを参照してください。

于 2012-11-26T10:44:50.337 に答える
1

基本的に、ここの誰もが示唆していることです。これは私が時々使っているマクロです。読みやすくなると思います。

in a separate header: (say debug_helper.h)
---------------------
#define COUNT_USAGE() {static int count=0;++count;std::cout<<"Called "<<count<<" times\n";}

In the CPP file:
----------------
#include "debug_helper.h"    

void callMe()
{
    COUNT_USAGE();
}
于 2012-12-10T04:01:56.687 に答える