HOME»基本情報技術者試験掲示板»グローバル関数について
投稿する

[5248] グローバル関数について

 雑魚の中の雑魚さん(No.1) 
大域
B=2

Opoc(X)
  整数型:A=3
  A ← A+B

Opco(Y)
  整数型:A=1
  整数型:B=1
  A ← A+B
  Opoc(X)
  Z ←A+B

pint Z

最初に読み込みをOpco(Y)から呼び出すとき、
答えは6になるのでしょうか?
それとも、2になるのでしょうか?
以上、よろしくお願いいたします。
2024.01.14 11:27
電タックさん(No.2) 
FE ブロンズマイスター
この投稿は投稿者により削除されました。(2024.01.14 13:36)
2024.01.14 13:36
電タックさん(No.3) 
FE ブロンズマイスター
スコープの近いものがある時はそちらが使われるはずなので、Opco(Y)内で定義されたBは大域のBとは別の扱いになります。

そのため、Opco(Y)でZに入るのは3となりますが、
Zがどこにも定義されていない変数なのでエラーとなるが正解かもしれません。
2024.01.14 13:39
 雑魚の中の雑魚さん(No.4) 
電タックさん、ご返信ありがとうございます。

もう一つ質問がありますが、Opco(Y)の A ← A+Bの次ところにOpoc(X)を呼び出す命令文がありますが、
その命令を実行したら、Aは5になりますが、それは気にしなくてもいいでしょうか?
2024.01.14 14:08
y4 kさん(No.5) 
この投稿は投稿者により削除されました。(2024.01.14 15:01)
2024.01.14 15:01
y4 kさん(No.6) 
この投稿は投稿者により削除されました。(2024.01.14 15:01)
2024.01.14 15:01
y4 kさん(No.7) 
この投稿は投稿者により削除されました。(2024.01.14 15:01)
2024.01.14 15:01
y4 kさん(No.8) 
投稿内容に誤りがあったので、改めて投稿します。

書いてある内容に則ると以下になります。
まず大域(グローバル)変数B(※1)が宣言されていますが、関数Opco(Y)内で宣言されている変数B(※2)とは別物の扱いとなります。
(同名での変数宣言を避けるのが一般的なプログラマかと)

なので、関数Opco(Y)内では
1) まずA=1, B(※2)=1となります。大域変数B(※1)には代入されません。
2) A←A+Bですが、PythonであればB(※2)となりA=2となります。
3) その後, Opoc(X)とありますが、変数Xの宣言がないので引数として渡せず異常終了します。
4) Z←A+Bは3)により実行されません。
5) print Zも当然実行されません。

ご質問したかった点について想像はできますが、正しく返信することはできないです。
2024.01.14 15:04
 雑魚の中の雑魚さん(No.9) 
y4 kさん、ご返信ありがとうございます。
もし、以下の式をOpoc2()から実行すると、
Zはどうなるのでしょうか?


大域
B=2

Opoc1()
  整数型:A=3
  A ← A+B

Opoc2()
  整数型:A=1
  整数型:B=1
  A ← A+B
  Opoc1()
  Z ←A+B
2024.01.14 16:46
y4 kさん(No.10) 
プログラム言語の仕様により動作が変わる事もあります。
なので、No.9が動作するPythonの例で考えます。

1) 関数Opoc2()で宣言された各ローカル変数に、値1が代入されます。
2) ローカル変数A,Bを用いた結果、Aの値は2になります。
3) 関数Opoc1()を実行しますが、戻り値が無い為関数Opoc2()では変数の値は変化しません。
4) 変数Zにはローカル変数の値が用いられる為2+1の3となります。
2024.01.14 17:15
 雑魚の中の雑魚さん(No.11) 
なるほど、本当にありがとうございます!
2024.01.14 17:36
KKさん(No.12) 
y4 kさん、
下記について、ご教授いただけますでしょうか。Opoc1()を実行してから、Aの値は5になる認識ですが、その後、Z ←A+B  にすると、Zは7になるんではないでしょうか。

3) 関数Opoc1()を実行しますが、戻り値が無い為関数Opoc2()では変数の値は変化しません。
2024.01.15 10:38
y4 kさん(No.13) 
KKさん
関数Opoc1()内のローカル変数Aの値であれば、宣言時にA=3と代入されます。
また、Opoc1()ではローカル変数Bを宣言していないので大域変数B(=2)が参照されます。
その為、関数Opoc1()内ではローカル変数Aの値は5となります。

しかしながら、あくまでもローカル変数です。
「関数の中」だけで有効な変数という意味になります。

更にOpoc1()内で得られたAの値(=5)は、戻り値として呼び出し元ヘ返されていません。
そのためOpoc2()内の変数の値は何一つ変わらないのです。
2024.01.15 14:35
y4 kさん(No.14) 
KKさん
書き方を変えます。この例で言うなら
大域変数B     〇
Opoc2()内
   A          △
   B          □
   A←A+B     (△=△+□の操作です)
   Opoc1()実行 詳細は後述
   Z←A+B     (Z=△+□の操作です)

Opoc1()内
   A          ◇
   A←A+B     (◇=◇+〇の操作です)
   (そして呼び出し元へ◇を返していない)

という動きになります。つまり同じ名前でも別物になることを御理解ください。
2024.01.15 14:59
KKさん(No.15) 
y4 kさん
了解しました。ご教授ありがとうございました。
2024.01.15 21:52

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop