先頭へ戻る

スコープ 解答ページ | Programming Place Plus C言語編 第22章

Programming Place Plus トップページC言語編第22章

先頭へ戻る

問題①

問題① 次のプログラムの実行結果を答えてください。

#include <stdio.h>

int num = 100;

void func(void);

int main(void)
{
    {
        int num = 300;
        printf( "%d\n", num );
    }

    func();
    printf( "%d\n", num );
}

void func(void)
{
    int num = 200;

    printf( "%d\n", num );
    {
        printf( "%d\n", num );
    }
}


実行結果は次のようになります。

実行結果:

300
200
200
100

main関数の最初にある printf関数では、同じブロック内にある変数num の値が出力されます。

次に、func関数内にある 2つの printf関数ですが、これはいずれも func関数内の変数num の値が出力されます。

main関数に戻ってきた後の printf関数では、その位置から可視なのは、グローバル変数の num だけですから、 グローバル変数の num の値が出力されます。

ルールとしては、今実行している箇所と同じブロックが優先され、 そこから外へ外へとスコープを広げて、宣言を探しにいくということです。

問題②

問題② 呼び出すたびに 0、1、2 … という具合に増加する整数を出力する myprint関数を作ってください。


グローバル変数を使って実現できます。

#include <stdio.h>

int gNum = 0;

void myprint(void);

int main(void)
{
    for( int i = 0; i < 5; ++i ){
        myprint();
    }
}

void myprint(void)
{
    printf( "%d\n", gNum );
    ++gNum;
}

実行結果:

0
1
2
3
4

問題③

問題③ 次のようなプログラムがあります。

#include <stdio.h>

int num = 100;

int main(void)
{
    int num;

    num = 10;
    printf( "%d\n", num );
    printf( "%d\n", num );  // グローバル変数の方を出力したい
}

コメントの箇所にある printf関数で、グローバル変数の方の num の値を出力できるように、 プログラムを書き換えてください。


一番早いのは、ブロックを作ることです。

#include <stdio.h>

int num = 100;

int main(void)
{
    {
        int num;

        num = 10;
        printf( "%d\n", num );
    }
    printf( "%d\n", num );  // グローバル変数の方を出力したい
}

実行結果:

10
100

変数名を変えてしまっても良いのなら、グローバル変数の名前を変えてしまう方が良いでしょう。

#include <stdio.h>

int gNum = 100;

int main(void)
{
    int num;

    num = 10;
    printf( "%d\n", num );
    printf( "%d\n", gNum ); // グローバル変数の方を出力したい
}

実行結果:

10
100



参考リンク


更新履歴

’2018/2/25 全面的に文章を見直し、修正を行った。

’2014/1/11 サンプルプログラムに含まれていた余計なコードを削除。

’2009/7/18 新規作成。



第22章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ