この章では変数の影響がどこまで及ぶのかを説明します。
変数にはスコープと呼ばれる有効範囲が存在します。
変数は関数の外で作成した変数と、関数内で作成した変数に分けます。
関数外で作成した変数はグローバル変数と呼ばれ、いつでも出力したり呼び出すことができます。
問題なのは関数内で作成した変数です。
これはローカル変数と呼ばれ、その関数内でしか使用することはできません。
また関数内と関数外で同じ変数名があった場合、つまりローカル変数とグローバル変数とが同じ変数名であった場合、関数内で優先されるのはローカル変数です。
では実際に例を見てみましょう。
この例ではわざとグローバル変数の
とheikin関数の中のローカル変数gの2つの同じ変数名を用意しました。
関数の中の
で出力されるのはローカル変数の99です。
つまりグローバル変数gの値である34よりローカル変数の99の方が優先されます。
結果は以下の通りです。
グローバル変数は関数内でも使用できますので、以下の例を見てください。
先ほどの例からローカル変数のgを削除しました。
その場合はグローバル変数gの値である34が関数内のgで使用されます。
結果は以下の通りです。
タグ: グローバル変数
関数で星座判定を作ってみよう
「if文で星座の判定をしよう」の章ではif文で星座判定のプログラムを作成しましたが、これを関数を使って書き換えてみましょう。
この例にはポインタ、2次元配列、関数、グローバル変数が含まれていますので、理解を深めてください。
では例をみてみましょう。







例えばmonthに1が入り、dayに19が入っているとします。
そうすると
の箇所はiが0の時にifの条件式がtrueになりますので、以下の入れ子のif文の条件式の判定に入ります。
「day <= day1[i]」の中のdayには19が入り、1周目の
にはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素である「やぎ座」が入ります。
例えばdayに19ではなく23が入っていると仮定すると
はFALSEになるので、
の条件式の判定に入ります。
ここでday2[i]にはday2の0番目の要素である31が入っていますのでTRUEになり、name には
に該当する星座が入ります。
1周目では
のiには0が入っていますので
で余りを求めると1になります。
結果、
となり「みずがめ座」が入ることになります。
では
をさらに詳しく説明します。
「i + 1」の箇所の説明をしますと例えばmonthが1で、day が23の場合には
が
になりFALSEになるので、else ifのブロックに入ります。
そして1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnames配列を1つ進めるために
で1を足しています。
「%12」を記述している理由は例えば
の中のiに11が入ると
の箇所が12になりますが、「%12」の箇所が無いと仮定すると
となってしまいます。
しかし、実際に
という要素はありません。
そこで「%12」で余りを0(12割る12で余り0)にして「やぎ座」が出るようにしています。
つまり、以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。
グローバル変数ですので、プログラムの中のどこからでも使用することが出来ます。そして、最後にmain関数の中でnameに入っている星座を出力しています。
結果は以下の通りです。
グローバル変数とローカル変数について知ろう
この章ではグローバル変数とローカル変数について説明します。
詳しい説明は例の後で行います。
では例をみてみましょう。

グローバル変数とは関数の外で宣言された変数のことを言います。
この例で言いますと以下の箇所です。
int a=2
これまではmain関数の中で変数を使用してきましたが、この
のように関数の外で宣言をするとグローバル変数になります。
グローバル変数は以下の通りどの関数の中でも使用することが出来ます。
ローカル変数とは関数の中で宣言された変数のことを言います。
ローカル変数は宣言をした関数の中でしか使用することが出来ませんので、複数の関数で同じ変数名を使用しても問題ありません。
つまり、関数の中だけが有効範囲なので、他の関数内で同じ変数名を作成してもお互い別の変数になるという訳です。
この例でいいますとmain関数とtashizan関数の中のローカル変数は同じ名前の変数名を付けても問題ありません。
例えば以下の例のようにmain関数とa関数の中でnumber変数を使用していますが、これらはお互いに影響を受けることはありません。
つまり、同じ変数名でも全く違う変数です。
ではもっと理解を深めるために次の例を見てみましょう。
まず初めにグローバル変数とローカル変数の確認から始めます。
関数の外側で宣言している
int a=23;
int b=25;
はグローバル変数です。
function1関数の中で宣言している変数はローカル変数です。
main関数の中で宣言している変数はローカル変数です。

次は変数の寿命について学習します。
関数の外でグローバル変数として
を宣言していますが、グローバル変数はプログラムが実行されてから終了するまで値を記憶しています。
functionは4つありますが、1回実行される度にグローバル変数は
により1が足されます。
後ほど学習しますがローカル変数は
が1回実行される度にクリアされるので値を保持することができません。
次は「static」について説明します。
static int a=0;
関数内でstaticを付けないと、ただのローカル変数になってしまいますがstaticを付けることでグローバル変数と同じ機能を持つことが出来ます。
つまり、プログラムが実行されてから終了するまで値を記憶させておくことが出来ます。
このstaticが付いた変数を静的変数と言います。
functionは4つありますが、1回実行される度に静的変数は
により1が足されます。
これはグローバル変数の挙動とまったく同じです。
次はローカル変数について説明します。
function関数内で宣言されている
はローカル変数です。
ローカル変数は関数が実行される度にデータがクリアにされるので情報を保持することはできません。
functionは4つありますが、
を1回実行するたびに
が実行されて、
で1を足されるので、いつまでも1のままです。
結果は以下の通りです。
メソッドを使って星座プログラムを作ろう
「if文で星座を判定しよう」で星座を出力させるプログラムを書きましたが、これをメソッドを使って書き替えてます。
この章はメソッドの学習ですので、BufferedReaderについては「キーボードの入力の値を受け取ろう」の章で説明します。





この例は星座の判定を judgeメソッドに任せています。
このように判定の部分をif文で長く書くのではなく、メソッド化することでコンパクトになりプログラムがすっきり書けます。
少しずつ分解しながら、説明していきます。
〇以下の箇所は「if文で星座を判定しよう」で説明したので、説明は省略します。
〇メソッドを呼び出しているのは以下の箇所です。
judge(month, birthDay);
judge(month, birthDay);の中のmonthのデータがjudgeメソッドの引数int monthに入り、birthDayのデータがint dayに入ります。
〇 judgeメソッド内の
の要素は星座名で配列を作成しています。
この配列内の要素は山羊座から順番通りに並んでいます。
決して、適当に並んでいるわけではありません。
〇judgeメソッド内の
には各星座の月の末日を配列に入れています。
judgeメソッド内の
には1月から12月までの末日を配列に入れています。
〇次に以下の箇所の説明をします。
例えばmonthに1が入り、dayに19が入っているとします。
そうすると
の部分はiが0の時にifの条件式がTRUEになりますので、以下の入れ子のif文の条件式の判定に入ります。
「day <= day1[i]」の中のdayには19が入り、1周目の
にはday1の0番目の要素である19が入っていますので、条件式はTRUEになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定すると
はFALSEになるので、
の条件式の判定に入ります。
ここで
にはday2の0番目の要素である31が入っていますのでTRUEになり、name には以下の条件に該当する星座が入ります。
この中のiには1周目では0が入っていますので
で余りを求めると1になりますので
となり、みずがめ座が入ることになります。
の箇所の説明をしますと例えばmonthが1で、day が23の場合には
が
になりFALSEになるので、else ifのブロックに入りますが、1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnames配列を1つ進めるために
で1を足しています。つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。
〇もし、judgeメソッドのmonthに100、dayに100などif文の条件式にマッチしないデータを入れるとnameには何も入りません。
そうなった場合にはnameには初期値のカラ文字
が入っているので、if文の条件式にマッチして「間違い」が出力されます。
staticについては「staticについて知ろう」の章で説明します。
次はmainメソッドの外で変数を宣言するとどうなるかについて説明します。
name変数はmainメソッドの外で宣言しているので、プログラムのどこからでも使用することが出来ます。
このような変数をグローバル変数と言います。
プログラム全体で変数を使いたい場合にはメソッドの外で宣言をしてください。
これまでメソッド内で使っていた変数はローカル変数と呼ばれています。
ローカル変数とはメソッド内で宣言して、メソッドの中に使用が限定されている変数です。
この例ではname変数を judgeメソッド内で使っているので、mainメソッド内でname変数の値を使うためにはグローバル変数にする必要があります。
グローバル変数とローカル変数について知ろう
この章ではグローバル変数とローカル変数について説明します。
詳しい説明は例の後に行います。
では例をみてみましょう。
グローバル変数とは関数の外で宣言された変数のことを言います。
この例で言いますと
がグローバル変数です。
これまではmain関数の中で変数を使用してきましたが、このaのように関数の外で宣言をするとグローバル変数になります。
グローバル変数は以下の通り、どの関数の中でも使用することが出来ます。
次にローカル変数について説明します。
ローカル変数とは関数の中で宣言された変数のことを言います。
ローカル変数は宣言をした関数の中でしか使用することができませんので、複数の関数で同じ変数名を使用しても問題ありません。
この例であればmain関数とtashizan関数の中のローカル変数は同じ名前の変数名を付けてもいいです。
例えば以下の例のようにmain関数とa関数の中でnumber変数を使用していますが、これらはお互いに影響を受けることはありません。
つまり、同じ変数名でも全く違う変数です。

ではもっと理解を深めるために次の例を見てみましょう。


初めにグローバル変数とローカル変数の確認から始めます。
function1関数の中で宣言している変数はローカル変数です。
main関数の中で宣言している変数はローカル変数です。
初めに、main関数内のローカル変数がprintfで出力されて,3と4が出力されます。
ローカル変数の有効範囲は宣言をした関数の中だけです。

次は変数の寿命について説明します。
関数の外でグローバル変数である
を宣言していますが、グローバル変数はプログラムが実行されてから終了するまで値を記憶しています。
後ほど説明しますがローカル変数は
が1回実行される度にクリアされるので値を保持することができません。
次はstaticについて説明します。
static int a=0;
関数内で変数にstaticを付けないと、ただのローカル変数になってしまいますが、staticを付けることでグローバル変数と同じ機能を持つことが出来ます。
つまり、プログラムが実行されてから終了するまで値を記憶させておくことが出来ます。
このstaticが付いた変数を「静的変数」と言います。
functionは4つありますが、1回実行される度に静的変数は
により1が足されます。
結果、
は値が1つずつ増えて「1,2,3,4」となります。
次はローカル変数について説明します。
function関数内で宣言されている
はローカル変数です。
ローカル変数は関数が実行される度にデータがクリアにされるので情報を保持することはできません。
結果は以下の通りです。

