網絡学習管理 速習C言語入門3 C exercises(d) Scope and Storage class

C exercises(d) Scope and Storage class

変数の通用範囲

自動変数のことを局所変数、外部変数のことをグローバル変数(大域変数)ともいいます。

変数のスコープの範囲を図で表してみます。

c_09_03

赤色で囲った部分がグローバル変数の有効範囲です。
青色で囲った部分がローカル変数の有効範囲です。

この図ではローカル変数の寿命を関数内と説明しましたが、正確にはブロック内です。
ブロックとは、{}で囲まれている範囲のことを指しています。

記憶クラス

Cで扱う記憶領域は一般に、プログラム領域、静的領域、スタック領域、ヒープ領域の 4つに大別されます。

記憶クラスには、4つあり、自動、静的、外部、レジスタがあります。

記憶クラス 記憶領域 スコープ 記憶クラス指定子
自動変数 スタック { } の内側 auto( 不要 )
静的変数 静的領域 { } の内側* static
外部変数 静的領域 全域 extern**
レジスタ変数 レジスタまたはスタック { } の内側 register
  • * { }の外側で宣言された時は、その行以降
  • ** 他のファイルにある時、externを付け、その変数を宣言(メモリを確保)しているファイルでは何も付けない。

自動変数は使う前に何らかの値を代入します。このことを、初期化するといいます。

静的変数は初期化の式がなくても、コンパイル時に0に初期化されます。

変数の名前

変数は名前を付けなければ、使えません。C言語では、名前(識別子)は、英字または’_’(アンダースコア)で始まり、英数字または’_’が0個以上続くという決まりになっています。’_’一つまたは二つで始まる変数は、システムに密着したデータに使います。例えば、コンパイラのプログラム等で使われます。

変数に名前を付ける時、外部変数は定義されている所から遠い所でも使われるので、その変数の用途を想像できるような名にすることが推奨されています。

    例:timetable, itemindex, thisyear

自動変数は通用範囲が狭いので、何の変数かがすぐわかるので、タイピングの手間を省く意味でも、短くて良いとされています。

    例:i, j, m, x, c

その場合でも、その変数がなんであるかを、瞬時に連想できるものが良いとされています。例えば、整数ならば、i、j、k、n、浮動小数点数ならば、x、y、z、文字ならば、cなどです。

#include <stdio.h>

void Func(void);        /* プロトタイプ宣言 */
void main(void);

/* 静的変数 i と自動変数 j の値を表示する */
void Func(void)
{                       /* i の値を読み書きできるのはこの関数の中でだけ */
                        /* i はずっと存在し続け、 */
        static int i;   /* func(  ) が呼ばれる度に1増える */

        auto int j;     /* 自動変数は初期化しないと */
                        /* ゴミの値が入っている */
                        /* j はゴミの値が表示される */
                        /* 幾つになるかはわからない */
                        /* auto は付けなくてもよい */
                        /* というより、普通は付けない */

        printf("i = %d  j = %d\n", i, j);        /* i, j の値を表示 */
        i++;        /* 値を1増やす */
        j++;        /* 値を1増やす */
}                   /* 関数を抜けたこの時点で、j は破壊される */

void main(void)
{

        Func(  );        /* 呼び出す度に i の値は 1 増える */
        Func(  );
        Func(  );
}

 演習

渡された引数の最大値を返す関数を作成してください。(教科書p299)

ヒント:

 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


Related Post

C exercises (1) guidanceC exercises (1) guidance

C言語プログラミングⅡの試験解説 #2015年度解答付後期C言語2プロ試験問題 C言語検定試験について 主催・認定 サーティファイ情報処理能力認定委員会 試験名 C言語プログラミング能力認定試験 (C-Language Programming Skills Qualification Test) 試験目的 C言語を駆使して応用プログラム(言語処理系、ユーティリティなど)を作成する能力を認定します。 認定基準 一級 C言語を駆使し、応用プログラム(言語処理系、ユーティリティなど)が作成できる能力を有する。 また使用しているOSについて理解をしている。 二級 小規模のプログラム(500行程度)が適切に(理路整然、簡潔、正しく、速く)書ける。 […]

C programming exercisesC programming exercises

【授業の概要】 コンピュータプログラム開発言語の中で広く利用されているC言語をCプログラミング開発環境ソフト: CPad for Borland C++ Compilerを使った一人一台のPCを使い実習により学びます. 毎回問題に取り組み理解を深めます。復習問題としてプログラミング課題を出題する。 【授業要旨】 回数 題目 授業内容 学習課題 予習時間(分) 復習時間(分) 1 ガイダンス 学習目的 C言語プログラミングⅡの試験解説   C言語検定試験について 授業内容を復習する 60 […]

C exercises(9) Basics of FunctionC exercises(9) Basics of Function

関数の基本 C言語において関数を使うことには、以下のような利点があります。 関数化しておくとそれを1つのブラックボックスとして扱うことができます。 つまり、使用する側が知っておくべきことは、以下の通りです。 入力として、どのような引数を与えるか 出力として、関数がどんな値を返すのか 関数を使ったことによって、どんな副作用があるか 一度、関数として作成しておけば、後で何度でも再利用することができる 関数として各機能をまとめていくと、一般にプログラムが見やすく、デバッグの作業もしやすい 関数の呼び出し #include <stdio.h> void func();   //関数のプロトタイプ宣言 int main() { func();    //関数呼び出し printf(" ここがメイン関数内\n"); return 0; } void func()    //自作関数 { […]