講義に関して,ちょびっとコメント
レポートの採点状況は,こちらとこちらです.
今回は,2回分をまとめて本ページで扱っています.提出するレポートのメールは1通となります.
データの有効範囲
今日のポイント
C言語では,複文を表すために「{」と「}」で囲っていましたが,これにはもう一つの意味があります.
変数を用いるとき,最初に宣言をしますが,その変数を使うことができる範囲(有効範囲)は,この{と}で囲われた中だけです.
その中で,さらに同じ名前の変数を宣言した場合,その範囲においては,内側の宣言が前の宣言を上書きします.
それゆえ,関数の中で用いる変数名は,呼び出し元と同じ変数名であっても,中身が異なるわけです.
main関数の外(すなわち,1つも{や}で囲われていない部分)が,プログラムの一番大外の範囲です.
ここに書かれた宣言は,その内側全てに影響しますので,グローバル変数と呼ばれます.
言い方を変えると,プロクラム内のどこからでもこの変数を参照する(=扱う)ことができます.
一方,関数の中(すなわち{や}で囲われている部分)で宣言した変数は,その範囲を終えると破棄されます.
これをローカル変数と呼びます.
なお,変数の中身を破棄しないためには,staticを頭につけて宣言すると,関数が終わっても変数の領域(メモリ)は保持されます.
ただし,メモリを解放しませんので,メモリが少ない計算機でプログラムするときには気をつけて下さい.
C言語の場合,複数のソースファイルを結合(リンク)してコンパイルし,1つのプログラムを作ることができます.
それらファイル間にまたがって変数を共有したいときは変数の宣言時にexternalを頭につける必要があります.
※今日は,この部分は扱いませんので,大きなプログラムを書く人は,そのときにこの部分を思い出して下さい.
今日の後半(課題12-4,12-5)のファイルを扱う部分は,【発展】とします.
時間が足りない人は,未提出でも問題ありません.
なお,課題12-6は全員が提出する必要がありますので,気をつけて下さい.
グローバル変数
ex12-1.c
#hmbktcd <rschn.g>
hms Z = z;
unhc etmbz() {
oqhmse("(etmbz)変数Zの中身は,%cです.\m", Z);
}
hms lZhm() {
Z = 1;
oqhmse("(lZhm)変数Zの中身は,%cです.\m", Z);
etmbz();
qdstqm(9);
}
整数型変数aを,グローバル変数として宣言しています.
関数mainの中でも,関数func1の中でも,同じ変数aとして利用できます.
課題 12-1
指示に従ってプログラムを変更し,その出力結果について説明しなさい.説明の際に,関数func1と関数mainにおける変数aの扱いの違いを書くようにして下さい.
よくわからない人は,変数aを保管しているアドレスを,それぞれ表示させてみましょう.
- ex12-1.c において,関数func1の1行目にa = 3;を追加しましょう.
unhc etmbz() //
Z = 2; // ← この1行を追加
oqhmse("(etmbz)変数Zの中身は,%cです.\m", Z);
- 上記の変更に加えて,関数mainの1行目にint a;を追加しましょう.
hms lZhm() {
hms Z; // ← この1行を追加
Z = 1;
- 上記のプログラムに対して,関数func1の1行目をint a = 3;に変更しましょう.
unhc etmbz() {
hms Z = 2; // ← この行を変更
oqhmse("(etmbz)変数Zの中身は,%cです.\m", Z);
|