3

Cの異なる関数で同じローカル静的変数を宣言できますか?

例えば:

in function1:
void function1()
{
   static int a;
   a++;
   //dosomething here
}

in function2:
void function2()
{
   static int a;
   a++;
   //dosomething here
}

in function3:
void function3()
{
   static int a;
   a++;
   //dosomething here
}

この場合、function1 を 3 回呼び出してから function3 を 1 回呼び出した場合、function3 の a の値は 4 か 1 である必要がありますか?

4

2 に答える 2

5

これらは 3 つの異なる変数です。たまたま同じ名前を持っているだけです。1 つの値を変更しても、別の値は変更されません。

変数には、変数が表示されるスコープが関連付けられています。セクション6.2.1 C99 標準の識別子の範囲から:

識別子はオブジェクトを表すことができます。機能; 構造体、共用体、または列挙のタグまたはメンバー。typedef 名; ラベル名; マクロ名; またはマクロパラメータ。同じ識別子が、プログラム内のさまざまなポイントでさまざまなエンティティを示す場合があります。列挙のメンバーは、列挙定数と呼ばれます。プログラム変換のセマンティック フェーズの前に、ソース ファイル内のマクロ名の出現は、それらのマクロ定義を構成する前処理トークン シーケンスによって置き換えられるため、ここではマクロ名とマクロ パラメーターはこれ以上考慮されません。

と:

識別子が指定する異なるエンティティごとに、その識別子は、そのスコープと呼ばれるプログラム テキストの領域内でのみ表示されます (つまり、使用できます)。同じ識別子で指定された異なるエンティティは、異なるスコープを持っているか、異なる名前空間にあります。スコープには、関数、ファイル、ブロック、関数プロトタイプの 4 種類があります。(関数プロトタイプは、パラメーターの型を宣言する関数の宣言です。)

と:

他のすべての識別子には、その宣言の配置 (宣言子または型指定子内) によって決定されるスコープがあります。識別子を宣言する宣言子または型指定子がパラメーターのブロックまたはリストの外にある場合、識別子にはファイル スコープがあり、翻訳単位の最後で終了します。識別子を宣言する宣言子または型指定子がブロック内または関数定義のパラメーター宣言のリスト内にある場合、識別子にはブロック スコープがあり、関連付けられたブロックの最後で終了します。識別子を宣言する宣言子または型指定子が関数プロトタイプ (関数定義の一部ではない) のパラメーター宣言のリスト内にある場合、識別子には関数プロトタイプのスコープがあり、関数宣言子の最後で終了します。識別子が同じ名前空間内の 2 つの異なるエンティティを指定する場合、スコープが重複する可能性があります。もしそうなら、一方のエンティティのスコープ (内側のスコープ) は、もう一方のエンティティのスコープ (外側のスコープ) の厳密なサブセットになります。内部スコープ内では、識別子は内部スコープで宣言されたエンティティを指定します。外側のスコープで宣言されたエンティティは、内側のスコープ内では非表示になります (表示されません)。

a投稿されたコードの各(識別子) には関数aスコープがあるため、別の関数で宣言されたものに干渉しません。

静的変数は自動的に 0 で初期化されますか?

は、静的ストレージ期間であるのstaticライフタイムを指定します。aセクション6.2.4 オブジェクトの保存期間から:

識別子が外部リンケージまたは内部リンケージ、またはストレージ クラス指定子 static で宣言されているオブジェクトは、静的ストレージ期間を持ちます。このようなオブジェクトの場合、ストレージが予約され、格納された値はプログラムの起動前に 1 回だけ初期化されます。オブジェクトは存在し、一定のアドレスを持ち、プログラム全体の実行を通じて最後に格納された値を保持します.23)

およびセクション6.7.8初期化から:

静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:

-- ポインター型の場合、null ポインターに初期化されます。

-- 算術型の場合、(正または符号なし) ゼロに初期化されます。

-- 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。

-- 共用体の場合、最初に指定されたメンバーは、これらの規則に従って (再帰的に) 初期化されます。

Soaは に初期化され0ます。

于 2013-06-04T08:40:56.790 に答える