関数とは? また、ローカルとグローバルの変数の違い(スコープ)

   関数は、まとまった処理に、名前をつけたようなもの。
        その名前で実行(呼び出し)できるようになる。

これまで、printfやscanf、sqrt、randなどの関数を使ってきました。これから、このような関数を作る方法や、 関連するグローバルな変数について説明します。以下の例で、実行を確認ください。

以下では main関数以外に、func1という名前の関数と、func2という名前の関数を作っています。 この関数を作っている記述は、関数の定義と呼ばれます。
関数名直後のカッコの次にある{に対応する } までが、関数定義の範囲で、その中で宣言してきた 変数は、その関数の中にあるということで、 その関数の専用の変数となり、ローカル変数と呼ばれます。 これは宣言している関数以外の関数で使うことはできません。
 対して、関数定義の外側で作っている下記例のnnnは、 複数の関数からアクセス可能ということでグローバル変数と呼ばれます。
さて、関数定義は、他の関数定義中に記述することはできません。 そして、関数の定義位置より後方にある関数定義内で使うことができます。

このように、作った変数や関数が使える範囲は、その名前の 通用範囲またはスコープ(scope)と呼ばれます。
グローバル変数のスコープは、変数宣言位置以降のファイル終端までとなり、
ローカル変数のスコープは、宣言した位置から、 その宣言した位置の{に対応する終端の } までになります。
関数のスコープは、定義位置からのファイル終端までですが、プロトタイプ宣言をすることで、 そのプロトタイプ宣言位置からファイル終端までにすることができます。次のセレクタ選択して各用語の意味を確認ください。(全て確認しないと次へ進めません)

                        

なお、ローカル変数を初期化なしで宣言すると、 意味がない何かの値が記憶される状態になりますが、 グローバル変数は初期化なしで宣言すると0が記憶される状態になります。

関数は、何のためにあるか?

● 一度作っておけば、後で再利用することにより、開発が容易になります。

● 複数回使う『長いコードや難しいコード』を、重複して記述する必要がなくなります。関数にしておいて、呼び出すだけです。

● 適切な名前を使うことで、main関数などのコードが読みやすくなります。
(処理のまとまりを名前で呼び出す関数を使ことにより、mainのコードを短く簡潔に作れます。よって関数を使わない長いコードのmain関数より、 全体の処理が分かりやすく保守が容易になります。)

● ローカル変数とグローバル変数を巧く扱えば管理しやすい。変数の重要な度合いや、目的が分かり安くなる。
(関数内で宣言するローカル変数は、その中でしか使えない変数なので存在する目的が分かりやすい。)