Cプログラムのストレージクラス
変数とデータ型については上で説明しました。次に、変数をそのスコープと可視性によってどのように分類できるかを見ていきます。
スコープ:一般に、スコープは変数の存続期間を表す用語です。動作する期間と破棄されるタイミング。
可視性 :可視性は、変数が表示されている場所から、変数を使用できる場所を示します。例として、ローカル変数を使用する場合、別の関数やファイルからは使用できないため、ブロック内でのみ表示されます。
ブロック :ブロックは、2つの中括弧{…}の間の行のセットとして定義されます。例として
{ //line1 //line2 //line3 }
これはブロックです。
ストレージクラス | 宣言方法 | スコープ | 可視性 |
---|---|---|---|
auto | グローバル | | |
auto | ローカル | ブロック | ブロック |
登録 | グローバル | | |
登録 | ローカル | ブロック | ブロック |
static | グローバル | プログラム | ファイル |
static | ローカル | プログラム | ブロック |
extern | グローバル | プログラム | プログラム |
extern | ローカル | プログラム | ブロック |
ストレージクラスの基本構文:
<storage class> <datatype> variable_name; ex. static int my_var = 0;
注:like
自動:自動ストレージクラスは、すべてのローカル変数のデフォルトのストレージクラスです。
{ int mount; auto int month; }
上記の例では、同じストレージクラスにある2つの変数を定義しています。 「auto」は、関数内、つまりローカル変数内でのみ使用できます。
登録 :レジスタストレージクラスは、RAMではなくレジスタに格納する必要があるローカル変数を定義するために使用されます。これは、変数の最大サイズがレジスタサイズ(通常は1ワード)に等しく、単項'&'演算子を適用できないことを意味します(メモリ位置がないため)。
{ register int miles; }
レジスタは、カウンタなどの迅速なアクセスを必要とする変数にのみ使用する必要があります。 'register'を定義することは、変数がレジスターに格納されることを意味しないことにも注意する必要があります。これは、ハードウェアと実装の制限によっては、レジスタに格納される可能性があることを意味します。
静的 :静的 storageクラスは、プログラムがスコープに入ったりスコープから外れたりするたびにローカル変数を作成および破棄するのではなく、プログラムの存続期間中、ローカル変数を存在させ続けるようにコンパイラーに指示します。したがって、ローカル変数を静的にすると、関数呼び出し間で値を維持できます。
静的修飾子は、グローバル変数にも適用できます。これが行われると、その変数のスコープは、それが宣言されているファイルに制限されます。
Cプログラミングでは、静的がグローバル変数で使用されると、そのメンバーの1つのコピーのみがそのクラスのすべてのオブジェクトによって共有されます。
サンプルコード
#include <stdio.h> /* function declaration */ void func(void); static int count = 5; /* global variable */ main() { while(count--) { func(); } return 0; } /* function definition */ void func( void ) { static int i = 5; /* local static variable */ i++; printf("i is %d and count is %d\n", i, count); }
出力
i is 6 and count is 4 i is 7 and count is 3 i is 8 and count is 2 i is 9 and count is 1 i is 10 and count is 0
外部 :externストレージクラスは、すべてのプログラムファイルに表示されるグローバル変数の参照を提供するために使用されます。 'extern'を使用すると、変数を初期化できませんが、変数名は以前に定義された保存場所を指します。
複数のファイルがあり、他のファイルでも使用されるグローバル変数または関数を定義すると、externが別のファイルで使用され、定義された変数または関数の参照が提供されます。理解のために、externは別のファイルでグローバル変数または関数を宣言するために使用されます。
extern修飾子は、以下で説明するように、同じグローバル変数または関数を共有する2つ以上のファイルがある場合に最も一般的に使用されます。
サンプルコード(main.c):
#include <stdio.h> int count ; extern void write_extern(); main() { count = 5; write_extern(); } Example Code (support.c): #include <stdio.h> extern int count; void write_extern(void) { printf("count is %d\n", count); }
出力
count is 5
-
多重継承Pythonクラスでクラス変数はどのように機能しますか?
クラスは、Pythonの複数の基本クラスから派生させることができます。これは多重継承と呼ばれます。 多重継承では、すべての基本クラスの機能が派生クラスに継承されます。多重継承の構文は、単一継承に似ています。 class Super1: pass class Super2: pass class MultiDerived(Super1, Super2): pass 多重継承シナリオでは、指定された属性が現在のクラスで最初に検索されます。見つからない場合は、同じクラスを2回検索せずに、深さ優先、左右の方法で親クラス
-
なぜクラスを作成するのですか?
前回の記事に続いて、なぜnilを使用するのか、私たちが当たり前と思っている他のことについてこの質問をするのは良い考えだと思いました。 いいね… 醜いコードの巨大なブロブを1つだけ持つのではなく、なぜクラスを使用するのですか? 基本的なレベルでは、クラスを使用してコードとデータを論理ユニットに編成します。 しかし、それだけではありません。 クラスを使用すると、抽象化を作成できます 。 抽象化とは何ですか? 毎日、1分ごとに抽象化を使用します。 キーボード 私はこれを入力しています: ケーブル チェリーMXブラックスイッチ すべてをまとめるプラスチックケース 電気信号をコンピュータ