3

宣言された変数は、宣言さstaticれたファイル内でのみスコープを持ちますが、宣言されていない変数はstatic、extern 宣言を使用して他のファイルからアクセスできます。

staticしかし、 「グローバル」が変数に最後に割り当てられた値を保持させることは本当ですか。Static Local Purpose のように?

#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

8 に答える 8

2

「最後の値を維持する」という用語は、混乱を招きます。「最後の値を維持する」という用語は、関数のローカル変数と関数の静的変数のコンテキストで使用されます。関数内で宣言された変数はスタックに格納され、関数を終了すると、その関数によって使用されているスタックがクリアされ、変数が無効になるためです。

しかし、static で関数ローカル変数を作成すると、RAM に (スタックではなく) メモリが作成されます。これにより、関数の終了後もメモリを保持できます。グローバル変数やファイルの静的変数も RAM に格納されるため、その値は永久に保持されます。

したがって、質問の場合、RAM に格納されている変数は、キーワード static に関係なく「最後の値を維持」します。ただし、静的はその使用範囲を制限します。つまり、ファイルスコープで宣言されている場合はファイル内で使用(アクセス)でき、関数スコープで宣言されている場合はそのスコープが関数内に制限されます。

于 2013-08-08T06:38:37.873 に答える
1

global static variables初期化がありstaticます。それらは、それが作成されたファイルでのみアクセスできます。それらに値を割り当てない場合、それらは に初期化され0ます。
また、グローバル変数が関数の外で定義されている場合、そのスコープは定義されている場所から始まり、ファイルの最後まで続きます。

local static variableある関数呼び出しから別の関数呼び出しまでその値を維持できる変数であり、プログラムが終了するまで存在します。

#include <stdio.h>
int global_var;
static int static_var;
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;
}

global_varプログラムが実行されたときのstatic_var値を持っています。 プログラムが終了すると、それらの値は残ります。内 、関数が最初に呼び出されてからプログラムが終了するまで、オブジェクトが存在することを意味します。0
0
xfunc()

于 2013-08-08T03:26:20.583 に答える
1

ローカル静的変数は、ある関数呼び出しから別の関数呼び出しまでその値を維持できる変数であり、プログラムが終了するまで存在します。ローカル静的変数を作成するときは、初期値を割り当てる必要があります。そうでない場合、値はデフォルトで 0 になります。

グローバル静的変数は、それが作成されたファイルでのみアクセスできる変数です。この変数は、ファイル スコープを持つと言われています。

于 2013-08-08T04:26:15.347 に答える
1

int yこの例のコードに追加したものは、とyの両方から利用できます (つまり、アドレス指定可能です) 。main()func()

私はあなたのプログラムに他のコードを追加していないことに注意してくださいy. ただし、この説明では、 と の両方が を設定および参照できmainます。funcy

グローバル変数の使用を避けることができる場合はそうしますが、C では便利です。K&R はまさにこの点について論じています。

お役に立てれば。

于 2013-08-08T02:21:45.973 に答える