静的変数には、スコープ外に出た後でも値を保持する特性があります。したがって、静的変数は以前のスコープ内の以前の値を保持し、新しいスコープで再度初期化されることはありません。
構文:
static data_type var_name = var_value;>
以下は、C の静的変数に関する興味深い事実です。
Javaでファイルを削除する
1) 静的 int 変数は、プログラムの実行中メモリ内に残ります。通常変数または自動変数は、変数が宣言された関数呼び出しが終了すると破棄されます。
たとえば、関数が呼び出された回数をカウントするために static int を使用できますが、auto 変数はこの目的には使用できません。
例
C
// C Program to illustrate the static variable lifetime> #include> // function with static variable> int> fun()> {> >static> int> count = 0;> >count++;> >return> count;> }> int> main()> {> >printf>(>'%d '>, fun());> >printf>(>'%d '>, fun());> >return> 0;> }> |
>
>出力
1 2>
静的変数は 1 回だけ初期化され、プログラムの終了まで存続するため、上記のプログラムでは 1 2 が出力されます。そのため、複数の関数呼び出しの間でも値を保持できます。
ローカルの auto 変数に対して同じコードを試してみましょう。
例
デザインパターンJava
C
// C Program to illustrate local auto variable in comparison> // of static variable.> #include> // Function> int> fun()> {> >int> count = 0;> >count++;> >return> count;> }> // Driver Code> int> main()> {> >printf>(>'%d '>, fun());> >printf>(>'%d '>, fun());> >return> 0;> }> |
>
>出力
1 1>
2) 静的変数には、スタック セグメントではなくデータ セグメント内のメモリが割り当てられます。を参照してください。 C プログラムのメモリ レイアウト 詳細については。
3) 静的変数 (グローバル変数など) は、明示的に初期化されない場合、0 として初期化されます。たとえば、以下のプログラムでは、x の値は 0 として出力されますが、y の値はゴミです。見る これ 詳細については。
例
C
文字を int Java に変換
// C program to illustrate the default value of static> // variables> #include> int> main()> {> >static> int> x;> >int> y;> >printf>(>'%d
%d'>, x, y);> }> |
中央のCSSボタン
>
>
出力
0 [some_garbage_value]>
4) C では、静的変数は定数リテラルを使用してのみ初期化できます。たとえば、次のプログラムはコンパイルに失敗します。見る これ 詳細については。
例
C
フレディ・マーキュリー
#include> int> initializer(>void>)> {> >return> 50;> }> > int> main()> {> >static> int> i = initializer();> >printf>(>' value of i = %d'>, i);> >getchar>();> >return> 0;> }> |
>
>
出力
In function 'main': 9:5: error: initializer element is not constant static int i = initializer(); ^>
注記: この条件は C++ では当てはまらないことに注意してください。したがって、プログラムを C++ プログラムとして保存すると、コンパイルされて正常に実行されます。
5) C/C++ では、静的なグローバル変数と関数も使用できます。これらの目的は、変数または関数のスコープをファイルに制限することです。を参照してください。 C の静的関数 詳細については。
6) 静的変数は構造体内で宣言しないでください。その理由は、C コンパイラでは、構造体要素全体を一緒に配置する必要がある (つまり、構造体メンバーへのメモリ割り当てが連続している必要がある) ためです。関数内で構造を宣言したり (スタック セグメント)、メモリを動的に割り当てたり (ヒープ セグメント)、グローバル (BSS またはデータ セグメント) にすることもできます。どのような場合でも、構造体の要素の値は構造体の開始アドレスからの要素のオフセットをカウントすることによってフェッチされるため、すべての構造体のメンバーは同じメモリ セグメントに存在する必要があります。 1 つのメンバーだけをデータ セグメントに分離すると、構造の目的が損なわれ、構造全体を静的として持つことが可能になります。
関連記事:
- C++ の静的キーワード
- 静的キーワードに関するクイズ
- C++ の静的データ メンバー
- 静的オブジェクトはいつ破棄されますか?
- 静的メンバー関数に関する興味深い事実
- 静的関数を仮想化できますか?
- C++ と Java の静的キーワードの比較
- C の静的関数