わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

変数

Cで,関数と関連して変数を教えるとき,切り口は「有効範囲」と「生存期間」です.

  • 有効範囲は,コンパイルのときに,どこからどこまでの(ソースコードの)範囲でその変数が参照できるかを決めるものです.アドレス渡しにより,範囲外でも,その変数に結び付けられている値を参照したり代入したりすることは可能です.「グローバル変数」であれば,宣言時からファイルの終了まで.「ローカル変数」(何らかのブロックの中で定義された変数)なら,宣言時から,対応するブロックの終了までです.
  • 生存期間は,実行時に,変数に結び付けられているオブジェクトがどこからどこまでの(実行時の)期間に存在するかを決めるものです.「auto変数」であれば,宣言時からブロックの終了まで.「static変数」については,実行の最初(main関数の呼び出しに先立って)から実行が終わるまでです.

まずは,この有効範囲と生存期間が相異なる概念であることを説明した上で,組み合わせとして,

  • グローバルなstatic変数は定義できる(グローバルならば必ずstaticである)
  • グローバルなauto変数は定義できない
  • ローカルなstatic変数は定義できる
  • ローカルなauto変数は定義できる(これが最も多く使われる)

ことを提示していきます.
変数について,もう一つ,説明を抜かしてはいけないのは,重複定義です.変数名,関数名,その他のいくつかを合わせて「識別子」として,次のルールを解説しています.

  • グローバル区間に同一の識別子を複数定義*1してはならない.
  • ブロック内に同一の識別子を複数定義してはならない.
  • ブロック内に識別子を定義する際,それより外に同一の識別子があってもよい.ただしその場合,そのブロックで,外の同一の識別子を使用することができない.

最後のルールは,関数のモジュール化に役立ちます.それから,「関数内で,関数と同じ名前のローカル変数を定義することができるか? 定義することで,どのような不具合が生じるか?」という疑問にも答えることができます.

*1:ここは「宣言」と書くべきか? 「定義」でいいか? externは変数を「宣言」するものなので,ここはおそらく「定義」のほうがよさそうです.