はい。
回数が変ですね。
つまり、記事としては短いんです。今回。
ちょっとわかりづらい、重要なところをやるので今回こんな感じに
させてもらいました。
そうですね、用語としては、
「グローバル変数」と「ローカル変数」
の二つを学ぶので、この概念が理解できてる方は今回のは読む必要
ではサンプル。。
///////////////////////////////
var c;
Function main() {
a=10;
c=30;
if (a==10) {
b=20;
}
puts ("%a%¥n");
puts ("%b%¥n");
puts ("%c%¥n");
func();
}
Function func() {
puts ("%a%¥n");
puts ("%c%¥n");
}
///////////////////////////////
説明のために急遽作ったので、書いてあるように動かなかったら
報告をお願いします。すみません。
上から順番に解説する前に、varについて説明しなければならない
のですが...後にしましょう。とりあえずは、「この変数を使うよー」
と宣言するものと覚えておいてください。
varもしくは代入式は、関数外でも使用することができます。
よってvar c;では、変数が宣言されるのでcには0が代入されます。
はじめて変数を使ったとき、またはvarを使って宣言したときには
その変数には0が代入されるという決まりがあるのです。
main()内を見てみましょう。
まず、aとcにそれぞれ10と30を代入し、その後がif文ですね。
もしaが10だったら、bに20を代入。というわけでbに20が入る。
そしてa,b,cを全部表示して、func()に移行。
func()では、aとcを表示して終了です。
実行結果はわざわざ画像でのせる必要もありませんね。
と、いいつつも。これが一番重要です。
10
20
30
10
30
と、なっていますか?
なっていないはずです。実際は
10
0
30
0
30
となっていますね。
main()のbを表示するときには、if文内のb=20が適用されておらず、
func()のaを表示するときには、main()内のa=10適用されていない、
ということが観測できます。
ではどうして?と、思いますよね。
仕組みの解説を幾度も文章で試みましたが、なんかわかりづらいんです。
というわけでわかりやすい図にしてみました。
※こんな酷い図はあとで換えときます......
上の図でわかってもらえますでしょうか?
斜線は変数の適用される範囲で、四角が関数です。
main()で定義したaはfunc()ではまったく別物として再定義されてあり、
if文で定義したbはなんとif文の中でしか適用されていません。
つまりここから言えることは...
・変数は定義された場所により適用される範囲が変わる
・その範囲は定義されたところ以下の範囲に対してである
ということです。
よってmain()で定義されたaをfunc()で使おうとしても、そんなものは
ないことと同じなので、また別の変数として「func()のa」として定義
されるのです。
if文の中身、while文の中身も同様に、その中で代入式を使い定義して
もその後からは適用されなくなってしまうので注意が必要です。
それに比べてcは、関数外で定義されているためすべての関数に対して
有効にできます。
では、ここでfunc()の始まりに、
var c;
と追加してもう一度実行してみてください。
cの値が0になってますね?これこそがvarの使い方なのです!
varは、すでに定義範囲内の同じ名前の変数があってもその中
だけの変数ということで再定義することができるものです。
よってvar cによって全体のcとは別物の「func()のc」が準備
されて、0が代入されるということになります。
ちなみにこのvarを関数外の一番始めとかで使うと普通に全体に
対する定義となるため、一番はじめの変数定義にも使われるわ
けです。
ここで最後に暗記事項。
このとき、main()のaを、main()に対する「ローカル変数」と
呼び、それに対してcはmian()に対する「グローバル変数」と
いうように呼びます。
ようは地域限定か全国共通かということですよ。
同じ名前の地域限定があってもおかしくないですよね?
と、いうわけで解説は以上になります。
わかりましたでしょうか?わかってくださいw
このあたりを覚えておかないと、意図しない0が現れたときに
「あ、変数の問題だ」と気がつくことができなくなってしまい
ます。はじめは間違って当たり前なんです。
失敗したときの対処方法を身につけるために必ずこのことは
わかってください。
ではなんかうまく締まりませんが........
おつかれさまでした!
いいですか皆さん!
意図しない0がきたら叫びましょう。
「ローカル変数グローバル変数!!!」
と。
3 コメント:
ありがとうございます!
またためしてみますね!
やはりこれが理由でしたか、、
僕も初めのころ、こやつのせいで困ってたんですよねえw
まったくにくいやつです。
僕の場合わからなくなるので、必ずすべての関数に対するグローバル関数しか使ってません。
超非効率的なのですが....
というか理解していただけて光栄です...w
僕の場合、わからなくなるので必ずすべての関数に対するグローバル関数しか使ってません。
超非効率的なのですが....
その辺も含めて、また次回の方針を変える必要があると思ったので記事更新遅れます。
きっと身の詰まった内容にしますので、ちょっと待っててくださいね!
なんととうとうバックライトが故障してしまいました...
更新遅れはちょうどいいといえばいいですが..w
なのでまだこの記事もためせていないのです...すみません
ありがとうございます!
コメントを投稿