3

私は静的変数について勉強していて、ウィキペディアでこのコードに出くわしました。static int x は、プログラム全体で値を格納します。グローバルに宣言した場合でも、以前の値が保存されます。これは、静的変数とグローバル変数が同じものとして扱われることを意味しますか?そうでない場合、両方がどのように機能しますか?

#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 *argv[]) {
        func(); // prints 0
        func(); // prints 1
        func(); // prints 2
        return 0;
}
4

7 に答える 7

9

指定子staticは、使用する場所によって意味が少し異なります。プログラムの有効期間を通じて値を保持する変数を宣言するには、次の 3 つのオプションがあります。

1) 関数内で変数を宣言する場合static(つまり、ローカル変数) は、その値がプログラムの存続期間中、関数呼び出し間で保持されることを意味します。変数を値に初期化する場合、これは最初の関数呼び出しでのその変数の開始値です。後続のすべての関数呼び出しでは、変数の値が再初期化される代わりに保持されます。

2) グローバル変数を (指定子なしで) 宣言するstaticと、その値はプログラムの存続期間中、ローカルの静的変数であるかのように保持されますが、違いは、グローバル変数が可視である (読み書きできる) ことです。プログラムの任意のファイルの任意の機能によって。

3) グローバル変数を宣言するstaticと、その値はプログラムの存続期間全体にわたって保持されますが、単純なグローバル変数とは対照的に、同じファイル内の他の関数からのみアクセスできます。

結論として、これら 3 種類の変数はすべて値が保持されます。違いはスコープにあり、どの関数がこの変数にアクセスできるかを意味します。

次のコードの 3 つの変数はすべて、プログラムの存続期間中、その値を保持します。

int x = 100;         // visible to any function within any .c file of this program
static int y = 5000;  // visible from any function within this .c
int func (int i)
{
  static int z = 0;      // invisible to all other functions
  x += i;
  y += i;
  z += i;
  return z;
}

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

于 2016-04-13T14:36:23.077 に答える
1

グローバル変数と静的変数の両方を持つようにコードを変更しました。

#include <stdio.h>

 int z;              // can be accessed by other modules
 static int y;       // can only be used by this source module

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

 int main(int argc, char *argv[]) {
        y = 3;
        func(); // prints: 0 3
        func(); // prints: 1 4
        func(); // prints: 2 5
        return 0;
}

yは存続し、 と の両方からアクセスできmainますfuncxは存続しますが、からのみ読み取ることができますfuncz宣言されている場合、他のソース モジュール内の他のコードから読み取ることができますextern int z;

于 2013-09-17T04:57:56.417 に答える
0

はい、どちらもほとんど同じです。関数内で宣言された変数はstatic、その関数によってのみ参照/使用できます。

これは、特定の関数のみが使用する変数のスコープを制限するのに適しています。1 つの関数だけで使用されるグローバル変数を作成しても意味がありません。プログラムが不明確になります。

于 2013-09-17T04:42:29.900 に答える
0

はい、静的変数はグローバル変数と同じように格納されます。その値は、プログラムの存続期間中持続します。

関数のstatic外で宣言されている場合、キーワードは変数のスコープにも影響します。この変数は、別のソース ファイルから名前でアクセスすることはできません。

于 2013-09-17T04:42:49.253 に答える