1

静的がどのように機能するのか疑問に思っていました。次に例を示します。

void count()
{
    static int x = 1;
    cout << "Static: " << x << endl;
    x++;

    return;
}

int main()
{
    //Static variable test
    cout << endl;
    count();
    count();
}

このプログラムは、「1 と 2」の出力を提供します。しかし、関数「count」が2回目に呼び出されたときに、「static int x = 1」行が実行されないのはなぜですか?

4

4 に答える 4

6

これは言語規則です。static変数の初期化は1回だけ実行されます。

これはとは異なることに注意してください

static int x;
x = 1;

xこれは、すべての呼び出しで1にリセットされます。

于 2012-12-05T00:57:23.377 に答える
2

静的ローカル変数は、コンパイラがその 1 つの関数のみにアクセスできることを除いて、グローバル変数に似ています。構造体/クラスの静的メンバー変数を含む、静的に割り当てられたすべてのオブジェクト (組み込み型またはユーザー定義型) は、main() 関数を呼び出す前に、システムによって一度初期化されます。クラスのグローバル (または静的ファイル スコープ) インスタンスを作成し、クラス コンストラクターで何か興味深いことを行うことで、この特性を有利に利用できます (何が起こっているのかわからない場合は、奇妙な動作を得ることができます)。そのコードは、main() が開始する前に実行されます。

しかし....それを行うには注意が必要です。これらの初期化されたオブジェクトの順序を強制する標準的な方法はないため、既に初期化されている別のオブジェクトに依存している場合、コンパイラまたはコンパイラ オプションを変更したり、追加/削除したりすると、ある日「正常に動作する」ものが「正常に動作しない」ようになる可能性があります。ソースファイルなど

于 2012-12-05T01:03:47.420 に答える
1

それがルールの言うことです。staticこの行は、関数が最初に呼び出されたときにのみ実行されると考えることができます。

于 2012-12-05T00:56:49.167 に答える
1

です。そうしないと、の値をまったく読み取ることができませんでしたxxただし、すでに作成されている場合の値は設定されません。

于 2012-12-05T00:57:24.170 に答える