22章 変数の種類について

http://www.geocities.jp/ky_webid/c/022.html

各種変数の説明がありました。

それぞれ特色が違うのでその違いをしっかり覚える必要がありますね。

問題1

次のプログラムの実行結果を答えて下さい。

int num = 100;
void myprint(void);

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

    return 0;
}

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

さーて同じ名前の変数が存在するのでわかりにくいですね。

ちょっとずつ読み解いていきましょう。

最初のprintfはmainのローカル変数なので200

次のprintfはスコープ内で定義されたローカル変数なので300

myprintでのprintfは一番大外で宣言されたグローバル変数なので100

最後のprintfはmainのローカル変数なので200

200
300
100
200

こういう感じであってるかな?

答え合わせ

パーフェクト。あってました。

問題2

キーボードから整数を入力し、その回数だけ「OK○」と表示させます。○の部分には何回目の表示であるかを示す数字を表示します。表示関数は独自に作り、その関数を必要な回数だけ呼び出すようにして下さい。

簡単そうです。

void output(int num);

void output(int num) {
    printf("OK%d\n",num+1);
}

int main () {
    int num,i;
    
    scanf("%d",&num);
    for(i=0;i<num;++i){
        output(i);
    }
    return 0;
}

バッチリOKでした。

でも実装した後に気が付いたのですが、静的ローカル変数でも同じようなことが実現できるんじゃないかと思い、実装してみました。

void output();

void output() {
    static int num = 1;
    printf("OK%d\n",num++);
}

int main () {
    int num,i;
    
    scanf("%d",&num);
    for(i=0;i<num;++i){
        output();
    }
    return 0;
}

問題なく動きました!

ただし、これってこの後output関数を呼び出しちゃうとnumの値が続きからになってしまうのでやっぱりこの問題では微妙かもしれませんね。

答え合わせ

解答例はstaticを利用した方法でした。

まあstaticの話が出てきたばかりなので当然それ使って実装しろよって話ですよね。

問題3

main関数と他の独自の関数をつくり、それぞれの中で同じグローバル変数の値を表示させて下さい。ただし、グローバル変数は、別のヘッダファイルに宣言し、それを#includeで組み込んで使用するようにして下さい。

さっそくやってみましょう。

// main.h
int g_num = 10;
void print();
// main.c
#include <stdio.h>
#include "main.h"

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

void print () {
    printf("print %d\n",g_num);
}
main 10
print 10

うまく表示されました。