auの日記

プログラミング初心者の日記。(auはハンドルネームです)

C言語でのスコープについて

auです。
今回はC言語を学んでいたら「変数のスコープ」という言葉を見つけて、どんなものだろうと思ったので調べてみました。

スコープとは

スコープを日本語に直すと"有効範囲"という意味になります。ローカル変数とグローバル変数の2種類があり、有効範囲に違いがあります。
また、有効範囲はプログラム内の"{}"で囲われた部分を指します。

ローカル変数

main関数や、自分で関数を宣言して作ったことがあると思います。その"{}"の中で宣言した変数のことをローカル変数といいます。ローカル関数のスコープ(有効範囲)は、その関数の中でのみ使用できるようになります。
実際にローカル変数を確認してみます。

#include<stdio.h>

int main(void) {
    int i = 5;  // ローカル変数
    printf("%d\n", i);
    return 0;
}
// 実行結果
5

ローカル変数は、main関数の中で宣言された" int i = 5;"ということが分かると思います。他の関数を作ってそこで実行してみようと思います。

#include<stdio.h>

void scope();

int main(void) {
    int i = 5;  // ローカル変数
    printf("%d\n", i);
    return 0;
}

int scope(void) {
    printf("%d\n", i);
}

// 実行結果
scope.c: In function ‘scope’:
scope.c:10:20: error: ‘i’ undeclared (first use in this function)
     printf("%d\n", i);
                    ^
scope.c:10:20: note: each undeclared identifier is reported only once for each function it appears in

新しい関数"scope"を宣言して実行しましたが、"scope関数内でiが宣言されていない"とエラーが起きてしまい、コンパイルすることができませんでした。
では、scope関数内でも"変数i"を表示させるにはどうすればいいかというと、グローバル変数を使うと使用することができます。

グローバル変数

自分が作成した関数の中だけではなく、関数の外でも変数の宣言をすることができます。これをすることで、プログラム全体で使用できる変数グローバル変数ということになります。
実際に使用してみます。

#include<stdio.h>

int scope(); //プロトタイプ宣言

int i = 7; //グローバル変数

int main(void) {
    int i = 5;  // ローカル変数
    scope(); // scope関数の呼び出し
    printf("%d\n", i);
    return 0;
}

int scope(void) {
    printf("%d\n", i);
    return 0;
}

// 実行結果
7
5

実行結果から、グローバル変数で"int i = 7"を宣言しているので、7がちゃんと表記されました。scope関数で、"変数i"を呼び出せていることが確認できると思います。プロトタイプ宣言については後でまた記事にします。

感想

Pythonにはなかったような書き方なので若干使いにくい部分がありました。