next up previous
Next: Gauss の消去法 Up: 計算機言語 I 第 11 Previous: 目標

大域変数と局所変数

最初の方の授業で, 変数の宣言を学びました. C 言語では, 変数は宣言しないと使えません.

函数内で宣言された変数の値は, その函数の中だけで変更可能で 他の函数から直接その変数の値を変化させる事はできません. (この授業では敢えてやりませんが, 間接的な形で変更する 事は可能です.) 函数の中で宣言された変数は, その函数の中だけに生きているのです. そういう意味で函数内の 変数の事を, 局所変数(local variable)といいます.

これに対して, 全ての函数の外で変数を宣言する事もできます. 函数の外で宣言するとどうなるかというと, 全ての函数で その値を参照したり, 変更したりすることが可能になります. つまり, その変数は, プログラム全体で生きているわけです. このような変数の事を, 大域変数(global variable)といいます.

次のプログラムでは, hensu という変数が大域変数 で定義されています. main()hensuを 1に 初期化してますが, addoneでその値に 1を加えています. 従って, addoneの後の hensuの値は 2になります.

なお, 値を返さない函数のプロトタイプ宣言では, 返り値を書く 部分を void とします.

/* File name 11-1.c */

#include <stdio.h>

int hensu;
void addone();

main()
{
        hensu=1;
        addone();
        printf("hensu=%d\n", hensu);	
}

void addone()
{
       hensu=hensu+1;
}

次のプログラムでは, hensumainの中で定義されています. 函数 addoneは int型の引数を持ち, その引数に 1を加えています. 従って, addonehensu=addoneの引数」の値は, 2になります. しかし, addoneを実行しても, main()hensuは 1のままです. これは, 函数に引数として値を渡すときに, その値がコピーされて(通常の紙のコピーと同じように考えて下さい)渡されます. コピーの値を変えても(コピーされた紙に何かを書き込んでも)元の値 (コピーの原本)は変化しません. C言語では, 函数の引数渡しは, このように「値のコピー」が渡されると, 決められています. これは, C言語の特徴であり, 値による呼び出し(call by value) といわれています.

/* File name 11-2.c */

#include <stdio.h>
void addone(int hensu);

main()
{
        int hensu=1;
        addone(hensu);
        printf("In main, hensu=%d\n", hensu);	
}

void addone(int hensu)
{
        hensu=hensu+1;
        printf("In addone, hensu=%d\n", hensu);
}

このように「局所変数は直接他の函数から変えられない」ということは, とても重要な事ですので覚えていて下さい. なぜこのようになっているかというと,「間違いの無いプログラムを組むには, この方が便利」だからです. プログラムというのは突き詰めれば, データの変形(情報科学的な言葉でいうと, 計算機の状態遷移)を記述 する事に他なりません. 1つの変数が, 多くの場所で変化させられるように プログラムを組むと, 間違いの発見が大変になるからです.



Next: Gauss の消去法 Up: 計算機言語 I 第 11 Previous: 目標