C言語での変数のスコープと修飾子

変数のスコープ

スコープ

範囲は、可変領域の役割を定義するために使用され、{}可変範囲修飾子です。

変数

ローカル変数

  • ローカル変数のスコープはローカルです
  • 一般に、宣言された変数は、ローカル変数は} {あります
  • 最後のかっこで終わる開始の定義のローカル変数のスコープ、
  • ローカル変数が割り当てられていない場合は、ランダムな値に初期化

グローバル変数

  • グローバル変数のスコープはグローバルであり、この文書のどこにでも使用することができます
  • 一般的には、{}変数は、グローバル変数は外部宣言されています
  • 適用範囲は、このドキュメントの終端から始まるグローバル変数を定義しました
  • グローバル変数が割り当てられていない場合は、0に初期化

スコープオーバーレイ

可変範囲が異なる位置が重複定義された場合、ローカル遮蔽現象が発生します。

  • グローバル変数とローカル変数のスコープ重ね合わせが発生した場合、ローカル変数の対象に
  • ローカル変数とローカル変数のスコープの発生が重畳された場合、ローカル変数の前に一度ローカル変数の範囲は優先上記で定義されています
  • ローカル変数とローカル変数のスコープの発生が重畳されたとき、局所変数は、現在のスコープ内のローカル変数で定義された後、優先
  • グローバル変数は、主に、グローバル変数を、排除するためにマスクまたはシールドされていない後
#include <stdio.h>

int a = 1;

void show()
{
    int a = 2;
    printf("a = %d\n",a);
}

int main()
{
    printf("a = %d\n",a);
    int a = 3;
    printf("a = %d\n",a);
    show();
    printf("a = %d\n",a);

    {
        printf("a = %d\n",a);
        int a = 4;
        printf("a = %d\n",a);
    }
    printf("a = %d\n",a);

    return 0;
}

結果は以下のとおりです。

a = 1
a = 3
a = 2
a = 3
a = 3
a = 4
a = 3
  • 最初の印刷は、グローバル変数がシールドされていない、効果的なローカルおよびグローバル変数の定義が無い、= 1を印刷
  • グローバル変数は遮蔽され、第2の印刷、現在のローカル変数に有効な、印刷= 3
  • 第三の印刷= 2を印刷し、現在のカスタム関数のローカル変数のグローバル変数、ローカル変数をマスク
  • 第四に印刷は、グローバル変数がシールドされ、カスタム関数のローカル変数は= 3印刷し、解放されます
  • 第五の印刷は、グローバル変数が定義されていない現在のローカル変数{}、遮蔽され、主よりもローカル変数のスコープは、= 3を印刷します
  • 第六の印刷は、グローバル変数は、ローカル変数の主現在のスコープで定義されている現在のローカル変数に{}、= 4印刷を遮蔽され
  • 第印刷、グローバル変数が遮蔽され、現在のローカル変数に有効な、印刷= 3

名前付き汚染

  • エラーが発生した場合、通常の状況下では、同じスコープ内の変数を再定義しました
  • スコープがローカルであるため、さまざまなスコープでのローカル変数(上記の手順のように、彼らは把握することができます限り、)、一般的に問題がない場合は再定義
  • グローバル変数のスコープがローカルであるためと、同じ変数名は、多くの場合、汚染の名にちなんで名付け
  • 名前付き汚染は変数の発生のグローバルスコープの現象の再定義を参照して、大規模なチーム開発タスクに厳格な注意が必要です
  • この現象を回避するために、以下のグローバル変数、または変数グローバル統一管理を使用するには

ライフサイクル

  • スコープは、変数のスコープは、空間の概念と比較することができることを示しています
  • ライフサイクルは、それが時間の概念と比較することができ、変数の範囲は、プログラムの実行中に存在していることを示しています
  • スコープの変数は、そのライフサイクルの中に存在している必要があります
  • しかし、ライフサイクルの変数は必ずしも使用することはできないが、例えば、ブロックされ
  • {ライフサイクルここで、ローカル変数}一致、即ち排気ピン
  • プロセスは、プロセスの終了が消えグローバル変数を持つ行のライフサイクル
  • 変数の主な機能は、正確にローカル変数としてみなされるべきであるが、それはライフサイクルプロセスと一致しています

修飾子

改質剤は、そのライフサイクルや記憶領域を変化させることが可能な変数を変更するために使用されます。形式は次のとおりです。

修飾子は、データ型でした。

オート

  • 自動ローカル変数のみを修正するために使用される、省略することができます
  • ローカル変数がない他の修飾子場合、デフォルトは言うことです自動車、ある、通常の変数は、主に自動修正に使用しました
  • 特徴:オープン、すなわち疲れピンと使用

登録

  • ローカル変数は、変更することができます
  • 一般的に、メモリはCPUにレジスタに格納された変数である、アクセス速度を向上させることができます
  • ただし、CPUレジスタの限定された数は、通常、プログラムの最適化段階変性通常auto変数のために最適化されます

外部の

  • グローバル変数はのみ変更するために使用することができます
  • この文書では、にextern変更を加える必要性を超えて、変数の使用を定義し、それ以外の場合は、再定義が発生します
  • EXTERNに修正される変数にのみ使用することができ、再割り当てすることはできません
//main.c
#include <stdio.h>

extern int b;

int main()
{
    int a = 1;

    printf("a = %d\n",a);
    printf("b = %d\n",b);

    return 0;
}
//else.c
int b = 2;

結果は以下のとおりです。

a = 1
b = 2
  • Cファイルには、トップダウン、コンパイル一つずつです
  • externを変更することなく、ファイル内の他の変数は、エラーをコンパイルします
  • その後、コンパイルとリンク時に再リンク、ファイル内の他の変数を使用して変更することはextern

静的

場合は、静的ローカル変数の変更:

  • それはプロセスと一致しているように、ローカル変数は、ライフサイクルを変更します
  • 修正静的ローカル変数が初期化されていない場合、それは0に初期化されます

場合は、静的なグローバル変数の変更:

  • それをグローバル変数を作成変数拡張の限界は、このドキュメント内でのみ使用することができます
  • 避け命名汚染
公開された77元の記事 ウォンの賞賛5 ビュー4881

おすすめ

転載: blog.csdn.net/SAKURASANN/article/details/104508178