「D言語/関数」の版間の差分

削除された内容 追加された内容
→‎内部関数: ローカル変数とグローバル変数について修正
405 行
 
=== 内部関数と変数の有効範囲について ===
内部関数の中で定義したにある変数の寿命は、内部関数の中だけです。その内部関数の置き場所の関が再宣言されたか否かすら、もはや失効してい異なります。
 
int などの宣言子で再宣言された場合、その内部関数の置き場所の関数ですら、もはや失効しています。
 
 
文章では説明が難しいので、下記コードと実行結果をみてください。
 
==== 再宣言した場合 ====
 
;コード例
442 ⟶ 447行目:
 
内部関数の置き場所になっているsoto ですら、もはやaの値は(内部関数で定義した3ではなく)7に戻っています。
 
==== 再宣言しない場合 ====
いっぽう、再宣言しない場合、グローバル変数を書き換えます。
 
 
<syntaxhighlight lang="D">
import std.stdio;
 
int a=7;
 
void soto(){
void naibu() {
a=3; // int が無く、再宣言なしの単なる代入命令
writef("内部関数の中で aはいま%d\n", a);
}
naibu(); // 利用の際は呼び出すのを忘れないように
writef("内部関数の隣りでは aはいま%d\n", a);
}
 
 
void main()
{
soto();
writef("mainに帰還。aはいま%d\n", a);
}
</syntaxhighlight>
 
 
;表示結果
<pre>
内部関数の中で aはいま3
内部関数の隣りでは aはいま3
mainに帰還。aはいま3
</pre>
 
3行目のaの値に注目してください。上記コードの内部関数では再宣言しないで代入したので、mainに帰還した際にも、変数aが 7でなく3に置き換わっています。
:※ 実は2行目も、値が7から3に置き換わっている。
 
 
;備考
標準C言語やC++には内部関数そのものは無い。だがC++では、実はクラスや構造体のメンバ関数を使って、内部関数と似たような機能を実装できる。
 
学習の際には、C++のクラス・構造体のメンバ関数も参考にしよう。