✨ 最佳解答 ✨
簡単に まとめてみました。
まず、疑似言語の仕様が分からないので確認ですが、
・「大域: 文字型: a」が大域変数の定義
・「文字型: a」が局所変数の定義
・「a ← "A"」が変数への代入
ということで、いいですよね?
■大域変数と局所変数は何が違うのか?
「どちらも a という箱に値をいれてるわけではないのでしょうか?」
ということですが、それは合ってます。
大域変数も局所変数もデータを入れることができる箱です。
ただ、箱が置いてある場所が違います。
たぶんイメージで説明したほうが分かりやすいと思うので、例を出しますが、
・いま、学校の中にいる。
・廊下と、教室 3 つ『programA』『programB』『programC』がある。
と思ってください。
大域変数(グローバル変数)は『廊下においた箱』のことです。
廊下は共有スペースですから、どの教室の人も使うことができます。
それぞれの教室の中にも箱を置くことができます。
それが、局所変数(ローカル変数)です。
局所変数は、その教室にいる人しか使うことはできません。
ここで、変数 a を探すときのルールを決めます。
・まず教室の中を探す。
・見つかったら → 教室の中の箱 a を使う
・見つからなかったら → 廊下にある箱 a を使う
つまり、教室 → 廊下の順に箱を探すということです。
■コードを確認してみる
1 行めで、大域変数 a を定義し、"A" を代入してますね。
つまり、「a と書かれた箱を作り、"A" と書かれた紙を入れて、廊下に置いた」ということです。
11 行めで教室「programA」に入ります。
この時点で、教室は空です。箱はありません。
12 行めの a ← "B" で「変数 a に "B" を代入」してます。
この「変数 a」は、どの箱のことを指しているでしょうか?
ルールによると、教室 → 廊下の順に探しますよね。
いま教室には箱はないので、廊下の箱 a を指します。
つまり、廊下にある箱 a を開けて、中の紙を "B" と書き換えました。
14 行めの「文字型: a ← "A"」では局所変数 a を定義し、"A" を代入してます。
「新しい箱に a と書き、"A" と書かれた紙を入れて、教室 programA に置いた」ということです。
この時点で、a と書かれた箱は廊下と教室 programA に、あわせて 2 つ存在することに注意してください。
廊下の箱 a には "B", 教室の箱 a には "A" が入っています。
では、15 行めで手続 programB に渡している変数 a は、どの箱でしょうか?
教室 → 廊下の順に探すというルールですから、教室内の箱 a を指しますよね。
ですから、教室の箱 a の値 "A" を渡すことになります。
この後、"A" という値を持って、教室 programB に移動するわけですが、教室 programA にあった箱 a は、他の教室や廊下からは使えません。
変数を探すルールは「教室 programB → 廊下」の順になりました。
なので、22 行めの変数 a は、教室 programA の箱 a ではなく、廊下の箱 a を指します。
教室 programB には a と書かれた箱がありませんから。
最後の 17 行めの a は、教室 programA に戻ってきているので、教室 programA にある箱 a を指します。
というような感じです。
■「a ← "B"」と「文字型: a ← "A"」の違いは?
「a ← "B"」は、ルールに従って『箱 a を探し』、値を "B" に書き換えるという意味です。
なので、定義されていない変数に対して「c ← "B"」などと書くと、エラーになります。
「文字型: a ← "A"」は、『新しい箱 a を作り、いまいる場所に置き』、その中に "A" と書かれた紙を入れるという意味です。
変数 a の定義や宣言といいます。
上と違い、いまいる場所に存在しない名前に対して使います。既に存在するとエラーになる言語もあります。
■まとめ
・a と書かれた箱は、複数 存在することができる。
・いまいる教室 → 廊下(つまり、局所 → 大域)の順に探し、最初に見つかった箱を使う。
この 2 つのルールを理解していれば、解けると思います。
不明な点があったらコメントください。
分かる範囲で答えますので。
また、programc()
の33行目についてなのですが、
a←"C"
というのは、教室Cでは教室の箱の定義がされていないため廊下の箱 aの中にCをいれたというイメージで合っていますでしょうか
■programB という教室に programA の箱 a を持っていく?
いえ、そういうわけではありません。
箱(変数)そのものを持っていく、という機能はプログラミング言語には(普通は)ないからです。
持っていけるのは、値のみです。
イメージで書くと、
・15 行め: 教室 programA で教室内の箱 a を開け、中の紙に書かれた "A" を、別の新しい紙に書き写す。
・別の紙のみを持って、教室 programB へ移動する。(箱 a と中身の紙は置いていく)
・移動が完了した時点で、新しい箱 b を作り、持ってきた紙を入れる。
・22 行め以降の処理を開始……
となります。
箱 a と中身は教室 programA に置いたままですし、箱 a と箱 b は(現時点で値が同じだけの)もはや別物になったということです。
なので仮に、programB で箱 b の中身を書き換えたとしても、箱 a の値は変わりません。
22 行めの部分では、そもそも箱 a は教室 programB には持ってきていないので、廊下の箱 a を開けることになります。
■33 行めでは廊下の箱 a の中に "C" をいれた?
はい、そのとおりです。
教室 programC には何ももってきていませんし、何の局所変数も定義していないので、箱は 1 つもありません。
なので、箱 a といったら、廊下の箱 a (大域変数)を指すことになります。
ご返信ありがとうございます!
回答いただいた内容を見ながら、解き直してみて理解出来ました。
教室と廊下で例えてくださりありがとうございます。
イメージが湧きました。
疑似言語の仕様が分からないので確認ですが、
・「大域: 文字型: a」が大域変数の定義
・「文字型: a」が局所変数の定義
・「a ← "A"」が変数への代入
ということで、いいですよね?
→その通りです。
質問させていただきたいのですが、15行目でprogram B(a)を呼び出したところについてなのですが、
program Bという教室にprogram(A)の箱aを持っていくということでしょうか。
22行目の部分は、教室Aに置いてあった箱aを教室Bに持ってきたものの、
別の教室の箱は呼び出せないからここで呼び出すのは廊下にある箱aということでしょうか?
program Bという教室の中の箱 Bの中に、program Aという教室の中にあった箱aの価"A"を入れるということでしょうか?
うまく質問がまとめられず申し訳ないですが、教えていただけるとありがたいです🙇♀️