Page Top

今回は… anchor.png

変数の寿命について説明します。

変数の寿命とは、変数がデータを保っていられる範囲です。
変数の寿命は、基本的には宣言してからブロックの終わりまでが変数の寿命です。
ブロックというのは "{" と "}" に囲まれている部分のことです。

Page Top

今回のミソ anchor.png

  • "{" と "}"に囲まれたところを、ブロックという
  • 変数の寿命は基本的には宣言してからブロックの終端まで
Page Top

サンプルコード anchor.png

filesample1101p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
 
 
-
-
!
-
!
|
-
!
|
-
!
|
|
-
-
!
-
|
!
|
-
!
|
-
!
|
-
|
!
|
-
!
 
-
|
|
|
!
 
 
-
!
import std.stdio;
 
int main(char[][] args)
{
    // ブロック1開始
    
    // ポインタを宣言
    int* p;
    
    // 変数aを宣言
    int a=10;
    
    // pはaをさすポインタ
    p = &a;
    writeln(*p);
    
    {
        // ブロック2開始
        
        // ブロック1の中にあるからaの中身は大丈夫。
        // だから、*pでアクセスしてOK
        writeln(*p);
        
        // 変数bを宣言
        int b=100;
        
        // pがさしているものをbにする
        p = &b;
        
        // ブロック2の中にあるからbの中身は大丈夫。
        // だから、*pでアクセスしてOK
        writeln(*p);
        
        // ブロック2終了
    }
    
    // すでに終了しているブロック2の中にあるからbの中身はもう使ってはダメ。
    // だから、*pでアクセスしてはいけません。
    // 何が起こるかわかりません。
    // 最悪PCのフリーズだけではおさまらなくなることも…
    writeln(*p); // エラーにはならないけれど、NG!
    
    return 0;
    // ブロック1終了
}
+  Tango用はこちら
filesample1101t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
 
 
-
-
!
-
!
|
-
!
|
-
!
|
|
-
-
!
-
|
!
|
-
!
|
-
!
|
-
|
!
|
-
!
 
-
|
|
|
!
 
 
-
!
import tango.io.Stdout;
 
int main(char[][] args)
{
    // ブロック1開始
    
    // ポインタを宣言
    int* p;
    
    // 変数aを宣言
    int a=10;
    
    // pはaをさすポインタ
    p = &a;
    Stdout(*p).newline;
    
    {
        // ブロック2開始
        
        // ブロック1の中にあるからaの中身は大丈夫。
        // だから、*pでアクセスしてOK
        Stdout(*p).newline;
        
        // 変数bを宣言
        int b=100;
        
        // pがさしているものをbにする
        p = &b;
        
        // ブロック2の中にあるからbの中身は大丈夫。
        // だから、*pでアクセスしてOK
        Stdout(*p).newline;
        
        // ブロック2終了
    }
    
    // すでに終了しているブロック2の中にあるからbの中身はもう使ってはダメ。
    // だから、*pでアクセスしてはいけません。
    // 何が起こるかわかりません。
    // 最悪PCのフリーズだけではおさまらなくなることも…
    Stdout(*p).newline; // エラーにはならないけれど、NG!
    
    return 0;
    // ブロック1終了
}
Page Top

実行結果 anchor.png

1
2
3
4
5
$ dmd -run sample1101p.d
10
10
100
(何が起こるかわかりません。もしかしたら100ということもあるかもしれませんが…)
Page Top

まとめ anchor.png

上記の例では、アクセスしてはいけないポインタにアクセスしています。
うまいことこれが成功してしまうこともあるかもせません。
でも、これは危険なのでやめたほうがいいと思います。
また、このように使ってはいけないポインタに無理やりアクセスして起こる例外を
Null Pointer Exception
通称「ぬるぽ」
とか言ったりしますね。ガッ!!

Page Top

#02 - static anchor.png

Page Top

今回は… anchor.png

ブロックの終端で終わってしまう変数とはちがい、ブロックが終了しても値が持続するものを紹介します。
static というのが付いている変数がそうです。
これを静的変数と言います。
この静的変数は、プログラムが開始されたところからプログラムが終了するまでずっと寿命が続きます。
なので、先のようにアクセスしてはいけないというわけではなくなります。

Page Top

今回のミソ anchor.png

  • 静的変数を作るには変数にstaticをつける
  • 静的変数の寿命はプログラム開始時から終了時まで
Page Top

サンプルコード anchor.png

filesample1102p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
 
 
-
-
!
-
!
|
-
-
!
-
!
-
!
|
-
!
|
-
!
|
|
-
|
|
!
|
|
-
-
|
!
|
-
!
 
-
|
|
!
 
 
-
!
|
|
-
!
import std.stdio;
 
int main(char[][] args)
{
    // ブロック1開始
    
    // int*型の変数 p を宣言
    int* p;
    while (1)
    {
        // ブロック2開始
        {
            // ブロック3の開始
            
            // 静的変数 x の宣言
            static int x=0;
            
            // p はxを指し示すポインタ
            p = &x;
            
            // x の中身を確認
            write("x = ");
            writeln(x);
            
            // x を1増やす。
            // 一見意味がないように見えるけど、
            // x は静的変数なので、次にここを通った時に1増えている。
            writeln("x++");
            x++;
            
            // x が10を超えていたら終了します
            if(x > 10){
                break;
            }
            
            // ブロック3の終了
        }
        
        // 普通の変数であればブロック3は終了しているのでここで *p を使うのはダメ。
        // だけど、静的変数の寿命はプログラムが終了するまで続くので、
        // *p としてもOK
        write("*p = ");
        writeln(*p);
        
        // ブロック2終了
    }
    
    return 0;
    // ブロック1終了
}
+  Tango用はこちら
filesample1102t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
 
 
-
-
!
-
!
|
-
-
!
-
!
-
!
|
-
!
|
-
!
|
|
-
|
|
!
|
|
-
-
|
!
|
-
!
 
-
|
|
!
 
 
-
!
|
|
-
!
import tango.io.Stdout;
 
int main(char[][] args)
{
    // ブロック1開始
    
    // int*型の変数 p を宣言
    int* p;
    while (1)
    {
        // ブロック2開始
        {
            // ブロック3の開始
            
            // 静的変数 x の宣言
            static int x=0;
            
            // p はxを指し示すポインタ
            p = &x;
            
            // x の中身を確認
            Stdout("x = ");
            Stdout(x).newline;
            
            // x を1増やす。
            // 一見意味がないように見えるけど、
            // x は静的変数なので、次にここを通った時に1増えている。
            Stdout("x++").newline;
            x++;
            
            // x が10を超えていたら終了します
            if(x > 10){
                break;
            }
            
            // ブロック3の終了
        }
        
        // 普通の変数であればブロック3は終了しているのでここで *p を使うのはダメ。
        // だけど、静的変数の寿命はプログラムが終了するまで続くので、
        // *p としてもOK
        Stdout("*p = ");
        Stdout(*p).newline;
        
        // ブロック2終了
    }
    
    return 0;
    // ブロック1終了
}
Page Top

実行結果 anchor.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ dmd -run sample1102p.d
x = 0
x++
*p = 1
x = 1
x++
*p = 2
x = 2
x++
*p = 3
x = 3
x++
*p = 4
x = 4
x++
*p = 5
x = 5
x++
*p = 6
x = 6
x++
*p = 7
x = 7
x++
*p = 8
x = 8
x++
*p = 9
x = 9
x++
*p = 10
x = 10
x++
Page Top

まとめ anchor.png

というわけで、静的変数のデータには、ブロックを越えてアクセスしても大丈夫ですよ、というお話でした。
静的変数に対し、何もつけない場合のそれは自動変数と言います。
他にも外部変数なんてのもありますが、その辺は割愛します。

Page Top

#summary - まとめ anchor.png

Page Top

第11章のミソ anchor.png

  • "{" と "}"に囲まれたところを、ブロックという
  • 変数の寿命は基本的には宣言してからブロックの終端まで
  • 静的変数を作るには変数にstaticをつける
  • 静的変数の寿命はプログラム開始時から終了時まで
Page Top

宿題 anchor.png

静的変数を使ったらいい場合と悪い場合を考えましょう。

Page Top

コメント anchor.png

まぁ、特に今回はコメントはありません。 なんというか、静的変数に関してもほとんど使わないのでプログラミングすることは十分可能なので…というか、個人的にはあまり使わないので、頭に入れておくくらいでいいんじゃないかなと思います。
その割にはえぐい宿題だw
次回はスコープについて語ります。
変数の寿命とかなり似ていますが若干違いますよ。

さてさて、宿題の予想ついたら次にいきましょう~


Page Top

投票とコメント anchor.png

Choices Vote
大変参考になった1  
参考になった0  
あまり参考にならなかった0  
まったく参考にならなかった0  

No comment. コメント​/Articles​/D言語入門講座​/第11章 - 変数の寿命Edit

Name:

Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 1414, today: 1, yesterday: 0
Princeps date: 2009-04-20 (Mon) 23:17:40
Last-modified: 2009-04-20 (Mon) 23:17:40 (JST) (4658d) by SHOO
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu