【C言語】関数と変数のスコープ

【C言語】関数と変数のスコープ

目次

変数のスコープとは

C言語において「スコープ(scope)」とは、変数や関数が有効である範囲を指します。スコープにはいくつかの種類があり、 どこで定義されたかによって変数がアクセス可能な範囲が決まります。スコープを理解することは、バグを防ぎ、効率的なプログラムを作成する上で非常に重要です。

ローカル変数

ローカル変数とは、関数やブロック内で定義された変数のことを指します。ローカル変数はその関数またはブロックの内部でのみアクセスできます。


#include <stdio.h>

void func() {
    int x = 10; // ローカル変数
    printf("x = %d\n", x);
}

int main() {
    func();
    // printf("%d", x); // エラー: x は func 内でのみ有効
    return 0;
}

グローバル変数

グローバル変数は、関数の外部で定義された変数であり、プログラム全体からアクセス可能です。


#include <stdio.h>

int g = 100; // グローバル変数

void func() {
    printf("g = %d\n", g); // どの関数からでもアクセス可能
}

int main() {
    func();
    g = 200; // 値を変更
    func();
    return 0;
}

静的変数(static)

static 修飾子を付けた変数は、通常のローカル変数とは異なり、関数が終了しても値が保持されます。


#include <stdio.h>

void func() {
    static int count = 0; // 静的変数
    count++;
    printf("count = %d\n", count);
}

int main() {
    func();
    func();
    func();
    return 0;
}

外部変数(extern)

extern を使うと、他のファイルで定義された変数を参照できます。

file1.c:


#include <stdio.h>

int globalVar = 50; // 外部変数

file2.c:


#include <stdio.h>

extern int globalVar; // file1.c で定義された変数を参照

int main() {
    printf("globalVar = %d\n", globalVar);
    return 0;
}

ブロックスコープ

変数が特定のブロック({} で囲まれた範囲)内でのみ有効である場合、その変数は「ブロックスコープ」を持ちます。


#include <stdio.h>

int main() {
    int x = 10;

    {
        int y = 20;
        printf("x = %d, y = %d\n", x, y);
    }

    // printf("%d", y); // エラー: y はブロック外では無効
    return 0;
}

関数スコープ

C言語では、関数のスコープを持つのはラベルのみです。これは、goto 文でジャンプ可能な範囲を定義します。


#include <stdio.h>

int main() {
    goto label;
    int x = 10; // ここにはジャンプできない

label:
    printf("This is a function scope example.\n");
    return 0;
}

ファイルスコープ

static を使うと、グローバル変数や関数のスコープをファイル内に限定できます。

file1.c:


#include <stdio.h>

static int fileVar = 10; // このファイル内でのみ有効

void func() {
    printf("fileVar = %d\n", fileVar);
}

file2.c:


// extern int fileVar; // エラー: fileVar は file1.c 内でのみ有効

まとめ

  • ローカル変数: 関数内でのみ有効。
  • グローバル変数: プログラム全体からアクセス可能。
  • 静的変数: 関数を超えて値を保持。
  • 外部変数: 他のファイルから参照可能(extern)。
  • ブロックスコープ: {} 内でのみ有効。
  • 関数スコープ: ラベルのみが対象。
  • ファイルスコープ: static を使うとファイル内限定。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です