静的割当て、動的割当てについて

八王子さん  
(No.1)
https://www.ap-siken.com/s/kakomon/23_aki/q22.html

こちらのy=g(2)+g(2)についてです。
解説には

[g(2) 2回目]
static int v=1;//vはすでに確保済みなので3のまま

とありますが、『1回目のg(2)にてvは確保済み(v=3で確定した)のため、v=1とあっても1に上書きされず3のまま』という意味なら、そもそもの話、1回目のg(2)にてstatic int v=1;とある訳ですから3にもならなくないですか?
つまり

[g(2) 1回目]
auto int u; //u=2
static int v=1; //v=1
v=1+2; //v=1(静的割当で確保済みだから)
return v; //1を返す

となってしまいません?
2024.02.20 17:51
pixさん 
AP シルバーマイスター
(No.2)
この問ですが、プログラミング言語において変数のもつ性質について理解している
必要があります。
特にこの形式はC言語の形式となっているため、C言語の知識があると理解しやすいです。
逆にC言語など古い言語の知識がないと理解しがたいかもしれないです。

一般的に変数には以下の性質を必ず持っています。
・スコープ(見える範囲)
    大域(グローバル)
    局所(ローカル)
・寿命(生きている範囲)
    静的割り当て(値が消失しない)
    動的割り当て(値が消失する)

変数で一番基本的なものは
・局所で動的割り当て
    一般的に局所変数と呼ばれる。
    主に関数・手続きの中で定義されたもの。
    関数の中からしか見えない。
    関数から抜けると値が消失する。
です。
次に基本的と思われるのは
・大域で静的割り当て
    一般的に大域変数と呼ばれる。
    主に関数・手続きの外で定義されたもの。(トップレベルで定義されたもの)
    どこからでも変数が見える。
    値は消失しない。そもそも大域な変数は静的でしかありえない。

以上の2つはFEのプログラムやアルゴリズムで学習されたと思われます。
しかし、スコープと寿命の組み合わせは2パターン残っています。
・局所で静的割りて
    主に関数・手続きの中で定義されたもの。
    関数の中からしか見えない。
    関数から抜けても、値は消失しない。前の値を常に保持する。
矛盾した表現になりますが、範囲の狭い大域変数と考えたほうが分かりやすいかも
しれません。
このタイプの変数は特別な用途で用いられることが多いです。
今回の設問の「static int v = 1;」はこれに該当します。
分かりずらいのが、変数の初期化の「v = 1」の部分です。
変数の初期化はプログラムが起動した最初に行われます。
関数に入る毎ではないので注意です。

最後の組み合わせとなる
・大域で動的割り当て
    そもそも大域で動的に割り当てることはできないので、このタイプの
    変数は存在しない。

となります。
2024.02.20 18:23
boyonboyonさん 
AP シルバーマイスター
(No.3)
auto int u;
static int v=1;
これらは、変数の定義です。
とらえかたとして
uやvという入れ物を用意すると考えると分かりやすいです。
uには、値が入っていませんが、vには最初に1を入れておきます。
autoは、関数の処理が終わると入れ物ごとなくなりますが、
staticは、入れ物と値はそのまま残ります。

次に、再び
auto int u;
static int v=1;
で定義しようとすると、(入れ物を作る)
autoは、前と同じように定義できますが、
staticのvは、既に存在するので新らしく同名のvを定義することができません。
解説の
>vはすでに確保済みなので3のまま
は、このことを表しているのだと思います。

関数の中の  v=v+u  は、定義ではなく代入なので
v=3+2、v=5
になります。
2024.02.20 18:53
八王子さん  
(No.4)
ありがとうございます。
基本情報はノリで受かってしまったので局所的などあまりピンときません…
ただ、autoとstaticは定義の話というのは分かりました。ありがとうございました。
2024.02.23 07:26

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop