for文の内部的な仕組みについて疑問に思ったので質問させてもらいます。
追記:言語はC#でおねがいします。
for文を使った簡単なコードについて考えてみます。
using System; public class Hello{ public static void Main(){ for(int i = 0; i < 2; i++) { int a = 3; Console.WriteLine(a); } } }
上記のコードは実行することができます。
しかし、同じ処理である「「int型のaという変数を宣言し、3で初期化する。そのあと、aという変数の中身を出力する。」これを2回行う。」ということを以下のように書くと、A local variable named `a' is already defined in this scope のようにエラーが出て、実行できません。
using System; public class Hello{ public static void Main(){ int a = 3; Console.WriteLine(a); int a = 3; Console.WriteLine(a); } }
上のコードは実行できて、下のコードが実行できないのは、上のコードで1回目のループが終わったあとに、一度for文の{}を抜けることで、変数aの寿命が切れて死ぬことで、再びaという変数が宣言できるようになるからではないかと思います。
しかし、この予想が正しいとすると、カウンタ変数についてはどうでしょう。
ループを抜けているのなら、変数aと同様に、カウンタ変数iも同様に寿命を迎えて死んでいるはずです。しかし、2回目のループのとき、iは数値データを保持しており、ループもしっかり2回で終わります。この説明は理屈が通ってないと思います。
逆に、ループを抜けていないとするなら、iが数値データを保持できていることの説明はつきます。しかし、変数aは寿命を迎えて死んでいるのに、iは死んでいないので、この説明も理屈が通っていません。
このことをどうしたら説明できるか考えた結果、スコープが二重になっているのではないかと考えました。
つまり、外側のスコープで変数iを宣言し、内側のスコープでaを宣言しループの中身の処理が全て終わったらループを抜けて、外側のスコープに戻る。変数iをインクリメントしたのち、i < 2がtrueかをチェックし、trueなら内側のスコープに移り、もう1度ループを回す。i < 2がfalseになったら、ループを抜けて、外側のスコープからも抜ける。といった具合です。
これなら、for文を抜けたあと、再び変数iを宣言しようとしても、A local variable named `i' is already defined in this scope のエラーが出ないことの説明もつくのですが、どうやって確かめたらいいのかがわかりません。
今まで読んだ書籍のどこにも「for文ではスコープが二重になっている」、との記述は見当たらなかったので、そもそも間違っているかもしれませんが、私の予想は正しいのでしょうか?そして、それはどうすれば確かめることができるのでしょうか?
回答よろしくお願いします。
追記:私の中のイメージでは、どんな言語でも、ifやforのようなほとんど全ての言語に存在する機能の内部的なロジックは同じだと思っているのですが、言語によってfor文の仕組みが違うといったことはあるのでしょうか?
回答2件
あなたの回答
tips
プレビュー