Code019: Cプログラミング 〜しっかり基礎を固めようシリーズ 変数編〜

この記事は2002年に書かれたものです。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【 Webプログラミング Code Sample 】                          Since2001/11/23

                         Code019: Cプログラミング
                〜しっかり基礎を固めようシリーズ 変数編〜

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                                                    Produced by ichikoro.com

           ▼毎週月曜日と金曜日に配信しています。
           ▼等幅フォントでご覧いただくとキレイに見えます。
           ▼登録・解除はこちらから可能です。
               < http://www.ichikoro.com/webp/ >
                  ※バックナンバーへのリンクもあります。
                  ※お友達にもぜひお勧めください(^^)/

─【Contents】───────────────────────────────
    01.Speech ................... このメルマガは難しい?
    02.Review ................... 前回のおさらい
    03.Guide .................... しっかり基礎を固めよう:変数 その1
    04.Guide .................... しっかり基礎を固めよう:変数 その2 代入
    05.Guide .................... しっかり基礎を固めよう:変数 その3 初期化
    06.Guide .................... しっかり基礎を固めよう:変数 その4 型
    07.Guide .................... しっかり基礎を固めよう:変数 その5 命名ルール
    08.Question  ................ 今週の問題
    09.From Editor .............. 編集後記

「このメルマガは難しくなった」と読者の方からメールをいただきました。
それは半分正解ですが、もう半分はちょっと違います。難易度は特に変わ
っていないのです。

というお話から今週は入りたいと思います。
最近登録した方はそのまま下にどうぞ(^^;


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  01.Speech  「このメルマガは難しい?」
──────────────────────────────────────
最近、読者の方から「難しくなりましたね」というメールを何通かいただきました。
それは半分正解です。もともとこのメルマガは、全く知らない人にはわざと「ちょっ
と難しく」書いています。ですが、このテイストは以前も現在もあまり変わっていま
せん。少なくとも書き手はそう思っています。

では、何で以前よりも難しく感じるかというと理由は簡単。「知らない」からです。
ありがたいことに最初の頃から読んでいただいている皆さんは、もともとHTMLを多
少知っているか、ホームページについての知識がある程度ある方だったと思います。
またそういう人を対象に書いてきました。つまり、みなさんはある程度「知っていた」
のです。だからあまり難しく感じなかったと思われます。

で、Code012からプログラミングのメルマガに方向転換しました。そう、まったく知ら
ない世界に突入したのです。Code001の冒頭で書いたとおり、HTMLはプログラミング言
語ではありませんから、みなさんが培ってきた知識は役に立ちません。そう、生まれて
初めて体験する世界のわけです。


ちょっと視点を変えてみましょう。
なぜ人は「分からない」や「理解できない」と感じるのでしょうか?これの答えも簡
単です。単純に情報が不足しているからです。この必要な情報が欠如した時、人間は
「難しい」「分からない」といった状態になるのです。つまり難しいと感じたら、そ
れは何かがあなたに不足しているだけなのです。仮に他の人が理解できていること
は、誰にでも習得することができます。生きてきた時間が違うだけで、人間の基本性
能はみんないっしょだからです。(だからこそ、今までどう生きてきたかが大事なので
す。つまり人間の頭は非常に優秀なDB...という話はまた今度(^^;)


大事なのは「何が不足しているか」をあなた自身が見つけられるかどうかです。
逆にそれが何なのか見つけられれば、後はプチプチつぶしていくだけです。全てそれ
で解決するハズです。このメルマガは、あなたを程よく「分からない」状態にするの
を目的として書いています。逆に言えば、このメルマガで全部は分かりませんし、全
てを伝えるのは無理です。結局はあなたががんばるしかないのです。

まぁそれは世の中のほとんどのことに言えるため、何も考えずに「分からない」とし
か言えない人は、結局どこにいっても分からないのでしょう。


というわけで、今週もがんばってあなたの中にある?を見つけ、解決してください。
その手段として、有効にこのメルマガと作者をご利用ください(^^;


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  02.Guide  「前回のおさらい」
──────────────────────────────────────

C言語版の前回(Code015)で下のプログラムを掲載しました。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i = 1;
        while( i <= 100 ){
            printf("M.Katsube\n");

            i = i + 1;
        }

        return(0);
    }

    ・Code015: Cプログラミング
                    〜しっかり基礎を固めようシリーズ 定数編〜
        http://ichikoro.com/webp/back_list/?cd=00015


このプログラムで覚えていただきたいポイントは三つあります。

    ・演算子
    ・変数
    ・反復構造

です。
そこで前回は定数と演算子について解説しました。
今回はその続きになります。


ではまず変数から解説していきましょう。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  03.Guide  「しっかり基礎を固めよう:変数 その1」
──────────────────────────────────────

変数とは文字どおり「変な数」ではありません。ああ、お約束ですな(^^;
これをやらないと調子がでないので勘弁してやってください(笑)

さてさて、Code013で説明した通りCPUはメモリ上にある情報にしかアクセスできませ
ん。覚えてますか?そういう事情から何らかの情報を一時的に蓄えておきたい時や、
演算結果を取っておきたい時などは、それらをメモリ上で行うことになります。

    ・Code013: Cプログラミング  〜セットアップ編〜
        http://ichikoro.com/webp/back_list/?cd=00013

で、そのメモリ上にデータを置いたり演算結果を保存する場所をプログラムでは
“変数”といいます。微妙に嘘ついてますがそんな感じです。
上のプログラムで言うと、

    int i;

と書くと、メモリ上で“場所取り”が行われます。もっと詳しく言うとint個分のメ
モリを、iという名前で扱えるようになります。つまり今後はiという名前を操作する
ことで、メモリの読み書きが行えるようになるのです。具体的にメモリ上のどこに取
られるかというのは、プログラマが意識しなくてもいいように、コンパイラが自動的
にやってくれます。

この、場所取りとその場所に名前をつけることを“宣言”と呼びます。
変数を宣言しているので、変数宣言とも言います。


では、この変数を実際に操作してみましょう。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i = 10;
        printf("%d\n", i);

        return(0);
    }

        ※注釈
            詳しくは後述しますが、

                printf("%d\n", i);

            は変数iの内容を表示するものだと思ってください。


注目するのは、

    i = 10;

の部分です。イコール('=')を挟んで左側を左辺、右側を右辺と呼びましょう。
基本的には代入したい変数を左辺に、代入したい値を右辺に書きます。この場
合は、変数iに整数10を代入します。

というわけで、

    i = 2350;

だと、iには2350が入ります。


また、右辺の値は定数だけでなく演算をしたその結果を代入することもできます。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i =  100 + 50;
        printf("%d\n", i);

        return(0);
    }


といった感じです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  03.Guide  「しっかり基礎を固めよう:変数 その2 代入」
──────────────────────────────────────

さてさてここまではそんなに難しくないと思います。
この号の佳境はこれからです(^^;

変数への代入は、何度でも可能です。
そのたびに、その変数が扱っているメモリ上の領域が書き換えられていきます。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i =  10;
        i =  10 + 5;
        i =  15 - 15;

        printf("%d\n", i);

        return(0);
    }

以前お話したとおり、プログラムは上から順番に実行されていきます。
もうお分かりですね、最終的に表示される値はアレなわけです。


次はこの応用です。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i =  10;
        i =  i + 5;
        i =  i - 15;

        printf("%d\n", i);

        return(0);
    }

の実行結果はどうなるでしょうか?
もちろんポイントは

    i =  10;
    i =  i + 5;
    i =  i - 15;

です。
まず、

    i =  10;

これは分かりますよね?変数iに整数10を代入しています。
問題は次です。

    i =  i + 5;

これは下のように置き換えられます。

    i =  10 + 5;

右辺のiは、実際にはその前に代入された値なわけです。
逆に言えば、

    i =  100;
    i =  i + 5;

であれば、

    i =  100;
    i =  100 + 5;

と同じ意味になります。
さぁ、ここまで分かれば答えは出ますよね。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  04.Guide  「しっかり基礎を固めよう:変数 その3 初期化」
──────────────────────────────────────

ところで、最初に代入することを変数の「初期化」と言います。
下記のプログラムを実行してください。

    #include<stdio.h>

    int main(void)
    {
        int i;

        printf("%d\n", i);

        return(0);
    }

とすると、わけのわからない値が表示されたと思います。
変数を宣言した段階で、その変数の値は“不定”とされています。
つまり、

    #include<stdio.h>

    int main(void)
    {
        int i;

        i =  i + 5;
        printf("%d\n", i);

        return(0);
    }

などというプログラムを書いてはいけません。
変数を使用するには必ずこの初期化が必要です。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i = 0;
        i = i + 5;
        printf("%d\n", i);

        return(0);
    }

この初期化は宣言時に行うこともできます。

    #include<stdio.h>

    int main(void)
    {
        int i = 0;

        i = i + 5;
        printf("%d\n", i);

        return(0);
    }

どちらでも好きな方を使うことができます。


では、おまけを一つ。
下のプログラム、最終的に変数iの値はいくつになるでしょうか?

    int i;

    i = 0;
    i + 5;

答えは 0 です。
理由は簡単。代入しなければメモリの値は変わらないのです。
最初の頃は結構忘れがちなので、しっかり頭に入れて置いてください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  05.Guide  「しっかり基礎を固めよう:変数 その4 型」
──────────────────────────────────────

ここまではOKでしょうか?
ゆっくりと見ていけば、そんなに難しい話ではないと思います。

さてさて、ここまでたびたび出てきた“int”とは一体なんなのでしょうか?全ての変
数には「型」という考え方があります。この型によって、メモリ上に取られる大きさが
変わってくるのです。つまり変数に代入する事のできる値の大きさが変わるのです。

C言語にはint以外にも下のような型があります。

    short   主に整数を扱う。
    int     主に整数を扱う標準的な型。環境によって大きさが異なる。
    long    shortより大きな整数を扱う。
    char    主に文字を扱う。
    float   小数点を扱うときに使用。
    double  floatより桁数の多い小数点を扱うときに使用。

メモリ上に取られる大きさを知るためにはは、下記のプログラムを実行してみてください。

    #include<stdio.h>
    
    int main(void)
    {
        printf("short  %d byte\n", sizeof(short));
        printf("int    %d byte\n", sizeof(int));
        printf("long   %d byte\n", sizeof(long));
        printf("char   %d byte\n", sizeof(char));
        printf("float  %d byte\n", sizeof(float));
        printf("double %d byte\n", sizeof(double));

        return(0);
    }

この実行結果は環境によって違ってきます。例えば古い環境だとintの値が2byteの場
合があります。(そのため実際にアプリを作る際には使用を避ける場合があります)
私が始めて触った時、intは2byteでした。

    C:\>bcc32 sizeof.c
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    sizeof.c:
    Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
    
    C:\>sizeof
    short  2 byte
    int    4 byte
    long   4 byte
    char   1 byte
    float  4 byte
    double 8 byte

ちなみに、いずれの環境でも

    char <= short <= int <= long

という関係が成り立ちます。と、これだけじゃピントこないと思いますので、具体的
にどれだけの値を扱えるのか調べてみましょう。これを知るには下記のプログラムを
実行してみてください。

    #include<stdio.h>
    #include<limits.h>
    
    int main(void)
    {
        printf("%12d <= char  <= %12d \n", CHAR_MIN, CHAR_MAX);
        printf("%12d <= short <= %12d \n", SHRT_MIN, SHRT_MAX);
        printf("%12d <= int   <= %12d \n", INT_MIN,  INT_MAX);
        printf("%12d <= long  <= %12d \n", LONG_MIN, LONG_MAX);

        return(0);
    }

    C:\>bcc32 limits.c
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    limits.c:
    Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

    C:\>limits
            -128 <= char  <=          127
          -32768 <= short <=        32767
     -2147483648 <= int   <=   2147483647
     -2147483648 <= long  <=   2147483647

これだけの値が扱えるわけです。
という説明では随分とはしょっているのですが、詳しいことは否が応でも今後出てき
ますので、ここでは考え方を押さえておいてください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  06.Guide  「しっかり基礎を固めよう:変数 その5 命名ルール」
──────────────────────────────────────

ちなみに、ここまでは 'i' という名前の変数を使ってきましたが、この変数名は
プログラマが自由につけることができます。確かに自由に使えますが、以下のルー
ルに従わないといけません。

    ・使用できるのは半角英数字と_(アンダースコア)
    ・大文字と小文字は区別される。
    ・最大で31文字まで

    ・ただし数字で始まってはいけない
    ・同じ名前の変数が複数存在してはいけない。
        ※型が違っても同名の場合はエラー扱いになります。

    ・以下にある予約語は使ってはいけない
        ※automaticなどのように、予約語を「含む」単語は使っても大丈夫です。
         ~~~~
            auto      break   case      char    const    continue default
            do        double  else      enum    extern   float    for
            goto      if      int       long    register return   short
            signed    sizeof  static    struct  switch   typedef  union
            unsigned  void    volatile  while

つまり

    int main(void)
    {
        long   2max;
        double MAX;
        short  MAX;
        char   else;
        int    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;

        return(0);
    }

というプログラムは

    C:\>bcc32 err.c
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    err.c:
    エラー E2040 err.c 3: 宣言が正しく終了していない(関数 main )
    エラー E2238 err.c 5: 'MAX' の宣言が複数見つかった(関数 main )
    エラー E2344 err.c 4: 一つ前の 'MAX' の定義位置(関数 main )
    エラー E2040 err.c 6: 宣言が正しく終了していない(関数 main )
    *** 4 errors in Compile ***

ということになってしまうわけです。


通常、特に事情がない場合、変数は小文字をつけるのが慣習となっている場合
が多いです。ここらへんも後述します。また、必ず変数には意味のある名前を
つけましょう。

後、

    int a, b, c;

といった具合に ',' で区切ると複数の変数を同時に宣言できます。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  07.Question  「今週の問題」
──────────────────────────────────────

    Q. 変数A と 変数B の値を入れ替え、それぞれ表示しなさい。
       ただし変数へ定数を代入するのは、それぞれ一度とする。
           ※つまり下のようなやり方は禁止。
                int main(void)
                {
                    int a;
                    int b;

                    a = 100;
                    b = 200;

                    a = 200;
                    b = 100;

                    return(0);
                }

    ・プログラムの一部(これに追加してね)
        #include<stdio.h>
        
        int main(void)
        {
            int a;
            int b;

            a = 100;
            b = 200;

            printf("スワップ前\n");
            printf("a -> %d\n", a);
            printf("b -> %d\n", b);
            printf("\n");

            printf("スワップ後\n");
            printf("a -> %d\n", a);
            printf("b -> %d\n", b);
            printf("\n");

            return(0);
        }

    ・実行例
        C:\>bcc32 swap.c
        Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
        swap.c:
        Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

        C:\>swap
        スワップ前
        a -> 100
        b -> 200

        スワップ後
        a -> 200
        b -> 100


こういう入れ替えのことを“スワップ”と呼びます。このスワップはプログラマの
登竜門です。これくらい解けないと今後つらいですので、ぜひ自力でといてみてく
ださいね。ちなみに、特別な技術はいりません。ここまでの情報で十分でしょう。
後は思いつくかどうかだけです。

方法は一つだけとは限りません。
色々と試してください。


正解は月曜日公開です!



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                           編    集    後    記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

今回初めてプログラムのメルマガ書いてるんだなぁと実感しました。<おい(^^;
とは言え、まだまだ基礎知識の説明が大部分のため、読んでるほうの書いてる方も
結構つらいと思いますが、そのうち面白くなると思いますので、がんばってついて
きてください。

ただ、こうしていろんなプログラムを見ていると、何となく実行結果が予想できるよ
うになって来ると思います。すでにそうなっている人はすばらしいです。確かに説明
をはしょっているので分からないところも多いでしょうが、それを逆に楽しいと感じ
ることができたり、自分からそれを応用したプログラムを組んでみたりしている人は、
向いているじゃないかなぁと思います。がんばってくださいませ。


と、少々厳し目のコメントを冒頭から書いていますが一言で言えば、がんばってない
人や考えていない人はあんまり応援したくないなぁということです(^^; がんばって
自分で調べつつ、メールで質問をくれるくらいがんばっているような人は逆に応援した
いなぁと思うわけです。


というようなメルマガを今後目指していこうと考えています。
ご意見やご要望などありましたら、ドシドシお寄せくださいませ。


ではでは、今度は月曜日にお会いしましょう! (^-^)/~~


■Information 
 「Webプログラミングからのお知らせ」

    【相互広告募集のお知らせ】
      読者数を増やしたいメルマガ発行者さんを募集しています。お互いに一定期間(1〜
      3回程度)広告を掲載し合いませんか?詳細はご相談ください(無料)

         お問い合わせ: mm-webp@ichikoro.com

    【コラム募集のお知らせ】
      Webプログラミングでは、寄稿していただけるコラムやプログラムなどを募集して
      います。たくさんの読者の方にあなたをアピールする場にもなります。ぜひ有意義
      な情報やご意見をお送りください。

         お問い合わせ: mm-webp@ichikoro.com

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

                   【 Webプログラミング Code Sample 】

                    発  行 : ichikoro.com
                発行責任者 : 勝部 麻季人
                              < mailto:katsube@ichikoro.com >
                  発行部数 : 1719部(前回)
                 Webサイト : < http://www.ichikoro.com/webp/ >
            お問い合わせ先 : < mailto:mm-webp@ichikoro.com >

                            Powerd by まぐまぐ
    All Right Reserved, CopyRight(C) 2001 Webプログラミング Code Sample
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


コメント

コメントを入力. Wiki文法が有効です:
Q K​ S V G